static const char* const CERTIFICATE = "-----BEGIN CERTIFICATE-----\n"
"MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n"
"MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n"
"-----END CERTIFICATE-----";
手动更新此字符串值可能容易出错。 若要生成正确的语法,可将以下命令复制并粘贴到 Git Bash 提示符下,然后按 ENTER。 此命令将生成 CERTIFICATE
字符串常量值的语法并将其写入到输出。
sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' device-cert.pem
复制并粘贴常量值的输出证书文本。
使用设备证书 unencrypted-device-key.pem 的未加密私钥更新 PRIVATE_KEY
常量的字符串值。
私钥文本的语法必须遵循下面的模式,不使用额外的空格或由 Visual Studio 进行解析。
static const char* const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n"
"MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n"
"X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n"
"-----END RSA PRIVATE KEY-----";
手动更新此字符串值可能容易出错。 若要生成正确的语法,可将以下命令复制并粘贴到 Git Bash 提示符下,然后按 ENTER。 此命令将生成 PRIVATE_KEY
字符串常量值的语法并将其写入到输出。
sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' unencrypted-device-key.pem
复制并粘贴常量值的输出私钥文本。
保存所做更改。
右键单击“custom_hsm__-_example”项目并选择“生成”。
在下一部分生成解决方案的其余内容之前,必须生成 custom_hsm_example 项目。
在 Visual Studio 菜单中,选择“调试”>“开始执行(不调试)”以运行该解决方案。 如果系统提示你是否重新生成项目,请选择“是”,以便在运行项目之前重新生成项目。
以下输出是模拟设备 my-x509-device
成功启动并连接到预配服务的示例。 设备已分配到 IoT 中心并注册:
Provisioning API Version: 1.8.0
Registering Device
Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
Registration Information received from service: contoso-iot-hub-2.azure-devices.net, deviceId: my-x509-device
Press enter key to exit:
在 Windows 命令提示符下切换到 X509Sample 目录。 此目录位于 .\azure-iot-sdk-csharp\provisioning\device\samples\Getting Started\X509Sample 目录中,在该目录中克隆了计算机上的示例。
输入以下命令,生成并运行 X.509 设备预配示例(将 <IDScope>
值替换为你在上一部分中复制的 ID 范围)。 证书文件将默认为 ./certificate.pfx,还将提示输入 .pfx 密码。
dotnet run -- -s <IDScope>
若要将证书和密码作为参数传递,可使用以下格式。
运行应用程序时可以传递其他参数以更改 TransportType (-t) 和 GlobalDeviceEndpoint (-g)。
dotnet run -- -s 0ne00000A0A -c certificate.pfx -p 1234
设备将连接到 DPS 并分配到 IoT 中心。 随后设备将向 IoT 中心发送遥测消息。
Loading the certificate...
Enter the PFX password for certificate.pfx:
Found certificate: A33DB11B8883DEE5B1690ACFEAAB69E8E928080B CN=my-x509-device; PrivateKey: True
Using certificate A33DB11B8883DEE5B1690ACFEAAB69E8E928080B CN=my-x509-device
Initializing the device provisioning client...
Initialized for registration Id my-x509-device.
Registering with the device provisioning service...
Registration status: Assigned.
Device my-x509-device registered to MyExampleHub.azure-devices.net.
Creating X509 authentication for IoT Hub...
Testing the provisioned device with IoT Hub...
Sending a telemetry message...
Finished.
在 Windows 命令提示符下,转到示例目录,并安装示例所需的包。 显示的路径相对于 SDK 克隆到的位置。
cd .\azure-iot-sdk-node\provisioning\device\samples
npm install
此示例使用五个环境变量,通过 DPS 对 IoT 设备进行身份验证和预配。 这些环境变量包括:
PROVISIONING_HOST
用于连接到 DPS 实例的终结点。 对于本快速入门,请使用全局终结点 global.azure-devices-provisioning.net
。
PROVISIONING_IDSCOPE
DPS 实例的 ID 范围。
PROVISIONING_REGISTRATION_ID
设备的注册 ID。 它必须与设备证书中的使用者公用名匹配。
CERTIFICATE_FILE
设备证书文件的路径。
KEY_FILE
设备私钥文件的路径。
为全局设备终结点和 ID 范围添加环境变量。 将 <id-scope>
替换为在步骤 2 中复制的值。
set PROVISIONING_HOST=global.azure-devices-provisioning.net
set PROVISIONING_IDSCOPE=<id-scope>
设置设备注册 ID 的环境变量。 IoT 设备的注册 ID 必须与设备证书上的使用者公用名匹配。 如果你按照本快速入门中的步骤生成了自签名测试证书,则 my-x509-device
是设备的使用者名称和注册 ID。
set PROVISIONING_REGISTRATION_ID=my-x509-device
为设备证书和(未加密的)设备私钥文件设置环境变量。
set CERTIFICATE_FILE=.\device-cert.pem
set KEY_FILE=.\unencrypted-device-key.pem
运行示例,然后验证设备是否已成功预配。
node register_x509.js
应会看到与如下示例类似的输出:
registration succeeded
assigned hub=contoso-hub-2.azure-devices.net
deviceId=my-x509-device
Client connected
send status: MessageEnqueued
在 Windows 命令提示符下,转到 provision_x509.py 示例的目录。 显示的路径相对于 SDK 克隆到的位置。
cd ./azure-iot-sdk-python/samples/async-hub-scenarios
此示例使用六个环境变量,通过 DPS 对 IoT 设备进行身份验证和预配。 这些环境变量包括:
为全局设备终结点和 ID 范围添加环境变量。
set PROVISIONING_HOST=global.azure-devices-provisioning.net
set PROVISIONING_IDSCOPE=<ID scope for your DPS resource>
设置注册 ID 的环境变量。 IoT 设备的注册 ID 必须与设备证书上的使用者名称相符。 如果你按照本快速入门中的步骤生成了自签名测试证书,则 my-x509-device
是设备的使用者名称和注册 ID。
set DPS_X509_REGISTRATION_ID=my-x509-device
为证书文件、私钥文件和通行短语设置环境变量。
set X509_CERT_FILE=./device-cert.pem
set X509_KEY_FILE=./device-key.pem
set PASS_PHRASE=1234
查看 provision_x509.py 的代码。 如果未使用 Python 版本 3.7 或更高版本,请执行此处所述的代码更改以替换 asyncio.run(main())
并保存更改。
运行该示例。 该示例将连接到 DPS,后者会将设备预配到 IoT 中心。 预配设备后,示例将向 IoT 中心发送一些测试消息。
$ python azure-iot-sdk-python/samples/async-hub-scenarios/provision_x509.py
RegistrationStage(RequestAndResponseOperation): Op will transition into polling after interval 2. Setting timer.
The complete registration result is
my-x509-device
TestHub12345.azure-devices.net
initialAssignment
Will send telemetry from the provisioned device
sending message #4
sending message #7
sending message #2
sending message #8
sending message #5
sending message #9
sending message #1
sending message #6
sending message #10
sending message #3
done sending message #4
done sending message #7
done sending message #2
done sending message #8
done sending message #5
done sending message #9
done sending message #1
done sending message #6
done sending message #10
done sending message #3
在 Windows 命令提示符下,导航到示例项目文件夹。 显示的路径相对于 SDK 克隆到的位置
cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
在示例代码中输入预配服务和 X.509 标识信息。 在预配期间,该信息在注册设备之前用于证明模拟设备。
在你偏好的编辑器中打开文件 .\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java
。
使用先前复制的“ID 范围”和“预配服务全局终结点”更新以下值。
private static final String idScope = "[Your ID scope here]";
private static final String globalEndpoint = "[Your Provisioning Service Global Endpoint here]";
private static final ProvisioningDeviceClientTransportProtocol PROVISIONING_DEVICE_CLIENT_TRANSPORT_PROTOCOL = ProvisioningDeviceClientTransportProtocol.HTTPS;
使用证书 device-cert.pem 的值更新 leafPublicPem
常量字符串的值。
证书文本的语法必须遵循以下模式,其中不包含额外的空格或字符。
private static final String leafPublicPem = "-----BEGIN CERTIFICATE-----\n" +
"MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" +
"MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" +
"-----END CERTIFICATE-----";
手动更新此字符串值可能容易出错。 若要生成正确的语法,可将以下命令复制并粘贴到 Git Bash 提示符下,然后按 ENTER。 此命令将生成 leafPublicPem
字符串常量值的语法并将其写入到输出。
sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' device-cert.pem
复制并粘贴常量值的输出证书文本。
使用设备证书 unencrypted-device-key.pem 的未加密私钥更新 leafPrivateKey
常量的字符串值。
私钥文本的语法必须遵循以下模式,其中不包含额外的空格或字符。
private static final String leafPrivateKey = "-----BEGIN PRIVATE KEY-----\n" +
"MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n" +
"X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n" +
"-----END PRIVATE KEY-----";
手动更新此字符串值可能容易出错。 若要生成正确的语法,可将以下命令复制并粘贴到 Git Bash 提示符下,然后按 ENTER。 此命令将生成 leafPrivateKey
字符串常量值的语法并将其写入到输出。
sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' unencrypted-device-key.pem
复制并粘贴常量值的输出私钥文本。
保存所做更改。
生成示例,然后转到 target
文件夹。
mvn clean install
cd target
生成过程将在 target
文件夹中输出采用以下文件格式的 .jar 文件:provisioning-x509-sample-{version}-with-deps.jar
;例如:provisioning-x509-sample-1.8.1-with-deps.jar
。 执行该 .jar 文件。 可能需要替换以下命令中的版本。
java -jar ./provisioning-x509-sample-1.8.1-with-deps.jar
该示例将连接到 DPS,后者会将设备预配到 IoT 中心。 预配设备后,示例将向 IoT 中心发送一些测试消息。
Starting...
Beginning setup.
WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
2022-05-11 09:42:05,025 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Initialized a ProvisioningDeviceClient instance using SDK version 2.0.0
2022-05-11 09:42:05,027 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Starting provisioning thread...
Waiting for Provisioning Service to register
2022-05-11 09:42:05,030 INFO (global.azure-devices-provisioning.net-6255a8ba-CxnPendingConnectionId-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Opening the connection to device provisioning service...
2022-05-11 09:42:05,252 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Connection to device provisioning service opened successfully, sending initial device registration message
2022-05-11 09:42:05,286 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-RegisterTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.RegisterTask] - Authenticating with device provisioning service using x509 certificates
2022-05-11 09:42:06,083 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Waiting for device provisioning service to provision this device...
2022-05-11 09:42:06,083 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Current provisioning status: ASSIGNING
Waiting for Provisioning Service to register
2022-05-11 09:42:15,685 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Device provisioning service assigned the device successfully
IotHUb Uri : MyExampleHub.azure-devices.net
Device ID : java-device-01
2022-05-11 09:42:25,057 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
2022-05-11 09:42:25,080 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
2022-05-11 09:42:25,087 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Initialized a DeviceClient instance using SDK version 2.0.3
2022-05-11 09:42:25,129 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - Opening MQTT connection...
2022-05-11 09:42:25,150 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT CONNECT packet...
2022-05-11 09:42:25,982 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT CONNECT packet was acknowledged
2022-05-11 09:42:25,983 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT SUBSCRIBE packet for topic devices/java-device-01/messages/devicebound/#
2022-05-11 09:42:26,068 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT SUBSCRIBE packet for topic devices/java-device-01/messages/devicebound/# was acknowledged
2022-05-11 09:42:26,068 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - MQTT connection opened successfully
2022-05-11 09:42:26,070 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - The connection to the IoT Hub has been established
2022-05-11 09:42:26,071 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Updating transport status to new status CONNECTED with reason CONNECTION_OK
2022-05-11 09:42:26,071 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceIO] - Starting worker threads
2022-05-11 09:42:26,073 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking connection status callbacks with new status details
2022-05-11 09:42:26,074 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Client connection opened successfully
2022-05-11 09:42:26,075 INFO (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Device client opened successfully
Sending message from device to IoT Hub...
2022-05-11 09:42:26,077 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Message was queued to be sent later ( Message details: Correlation Id [54d9c6b5-3da9-49fe-9343-caa6864f9a02] Message Id [28069a3d-f6be-4274-a48b-1ee539524eeb] )
Press any key to exit...
2022-05-11 09:42:26,079 DEBUG (MyExampleHub.azure-devices.net-java-device-01-ee6c362d-Cxn7a1fb819-e46d-4658-9b03-ca50c88c0440-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Sending message ( Message details: Correlation Id [54d9c6b5-3da9-49fe-9343-caa6864f9a02] Message Id [28069a3d-f6be-4274-a48b-1ee539524eeb] )
2022-05-11 09:42:26,422 DEBUG (MQTT Call: java-device-01) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - IotHub message was acknowledged. Checking if there is record of sending this message ( Message details: Correlation Id [54d9c6b5-3da9-49fe-9343-caa6864f9a02] Message Id [28069a3d-f6be-4274-a48b-1ee539524eeb] )
2022-05-11 09:42:26,425 DEBUG (MyExampleHub.azure-devices.net-java-device-01-ee6c362d-Cxn7a1fb819-e46d-4658-9b03-ca50c88c0440-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking the callback function for sent message, IoT Hub responded to message ( Message details: Correlation Id [54d9c6b5-3da9-49fe-9343-caa6864f9a02] Message Id [28069a3d-f6be-4274-a48b-1ee539524eeb] ) with status OK
Message sent!
选择“单个注册”。 先前创建的 X.509 注册条目 my-x509-device 应显示在列表中。
选择该注册条目。 设备分配到的 IoT 中心及其设备 ID 显示在“注册状态”下。
若要验证 IoT 中心上的设备,请执行以下操作:
在 Azure 门户中,转到设备分配到的 IoT 中心。
在“设备管理”菜单中选择“设备”。
如果设备已成功预配,则其设备 ID my-x509-device 应会显示在列表中,且“状态”设置为“已启用”。 如果未看到你的设备,请选择“刷新”。