以编程方式创建用于 TPM 证明的设备预配服务单个注册

本文介绍如何使用 Azure IoT 中心 DPS 服务 SDK 和示例应用程序,在 Azure IoT 中心设备预配服务中以编程方式为 TPM 设备创建单个注册。 创建单个注册后,可以选择通过此注册条目将模拟 TPM 设备注册到预配服务。

本文使用 Windows 开发计算机,不过,这些步骤在 Windows 和 Linux 计算机上均适用。

先决条件

  • 在基于 Windows 的计算机上安装 .NET 6.0 SDK 。 可使用以下命令来检查你的版本。

    dotnet --info
    

    重要

    必须使用 .NET 6.0 SDK 来生成并运行本文中的示例代码。 该示例当前不适用于更高版本的 SDK。

  • (可选)如果您想在本文末尾注册一个模拟设备,请按照快速入门:将模拟 TPM 设备预配中的步骤进行操作,直到获取设备认可密钥的步骤。 保存“认可密钥”,因为稍后需要在本文中使用。

    请勿按照这些步骤使用 Azure 门户创建个人注册。

  • 安装 Node.js v4.0+。

  • (可选)如果希望在本文末尾注册模拟设备,请按照快速入门:预配模拟 TPM 设备中的过程,执行至获取设备认可密钥和注册 ID 的步骤。 保存“认可密钥”和“注册 ID”,因为稍后需要在本文中使用。

    请勿按照这些步骤使用 Azure 门户创建单个注册。

  • 安装 Java SE 开发工具包 8。 本文稍后将安装 Java 服务 SDK。 它可以在 Windows 和 Linux 上运行。 本文使用 Windows。

  • 安装 Maven 3。

  • 安装 Git 并确保将路径添加到环境变量 PATH。

  • (可选)如果您想在本文末尾注册一个模拟设备,请按照快速入门:将模拟 TPM 设备预配中的步骤进行操作,直到获取设备认可密钥的步骤。 请记下背书密钥和注册 ID,因为您稍后会在本文中用到它们。

    请勿按照这些步骤使用 Azure 门户创建单个注册。

获取适用于预配服务的连接字符串

在本文的示例中,请使用预配服务的连接字符串。

  1. 登录到 Azure 门户。

  2. 在门户菜单或门户页上,选择 “所有资源”。

  3. 选择您的设备预配服务实例。

  4. 在服务菜单中的 “设置”下,选择 “共享访问策略”。

  5. 选择要使用的访问策略。

  6. 在 “访问策略 ”面板中,复制并保存主连接字符串。

    显示如何从 Azure 门户获取主连接字符串的屏幕截图。

创建单个注册示例

本部分介绍如何创建一个 .NET Core 控制台应用,以便向预配服务添加 TPM 设备的单个注册。

  1. 打开 Windows 命令提示符并导航到要在其中创建应用的文件夹。

  2. 若要创建控制台项目,请运行以下命令:

    dotnet new console --framework net6.0 --use-program-main 
    
  3. 若要添加对 DPS 服务 SDK 的引用,请运行以下命令:

    dotnet add package Microsoft.Azure.Devices.Provisioning.Service 
    

    此步骤将下载、安装 Azure IoT DPS 服务客户端 NuGet 包及其依赖项,并添加对其的引用。 此包包含 .NET 服务 SDK 的二进制文件。

  4. 在编辑器中打开 Program.cs 文件。

  5. 将文件顶部的命名空间语句替换为以下代码:

    namespace CreateIndividualEnrollment;
    
  6. 将以下 using 语句添加到文件顶部,位于namespace 语句之上:

    using System.Threading.Tasks;
    using Microsoft.Azure.Devices.Provisioning.Service;
    
  7. 将以下字段添加到 Program 类,并按所列内容进行更改。

    private static string ProvisioningConnectionString = "{ProvisioningServiceConnectionString}";
    private const string RegistrationId = "sample-registrationid-csharp";
    private const string TpmEndorsementKey =
        "AToAAQALAAMAsgAgg3GXZ0SEs/gakMyNRqXXJP1S124GUgtk8qHaGzMUaaoABgCAAEMAEAgAAAAAAAEAxsj2gUS" +
        "cTk1UjuioeTlfGYZrrimExB+bScH75adUMRIi2UOMxG1kw4y+9RW/IVoMl4e620VxZad0ARX2gUqVjYO7KPVt3d" +
        "yKhZS3dkcvfBisBhP1XH9B33VqHG9SHnbnQXdBUaCgKAfxome8UmBKfe+naTsE5fkvjb/do3/dD6l4sGBwFCnKR" +
        "dln4XpM03zLpoHFao8zOwt8l/uP3qUIxmCYv9A7m69Ms+5/pCkTu/rK4mRDsfhZ0QLfbzVI6zQFOKF/rwsfBtFe" +
        "WlWtcuJMKlXdD8TXWElTzgh7JS4qhFzreL0c1mI0GCj+Aws0usZh7dLIVPnlgZcBhgy1SSDQMQ==";
    
    // Optional parameters
    private const string OptionalDeviceId = "myCSharpDevice";
    private const ProvisioningStatus OptionalProvisioningStatus = ProvisioningStatus.Enabled;
    
    • 将 ProvisioningServiceConnectionString 占位符值替换为在上一部分复制的预配服务连接字符串。

    • 如果要将本文与快速入门一起使用 :预配模拟的 TPM 设备 文章来预配模拟设备,请将认可密钥替换为在本快速入门中指出的值。 可以将设备 ID 和注册 ID 替换为在该快速入门中建议的值,可以使用自己的值,也可以使用此示例中的默认值。

  8. 将以下方法添加到 Program 类。 此代码创建单个注册条目,然后调用 CreateOrUpdateIndividualEnrollmentAsync 中的 ProvisioningServiceClient 方法,将单个注册添加到预配服务。

    public static async Task RunSample()
    {
        Console.WriteLine("Starting sample...");
    
        using (ProvisioningServiceClient provisioningServiceClient =
                ProvisioningServiceClient.CreateFromConnectionString(ProvisioningConnectionString))
        {
            #region Create a new individualEnrollment config
            Console.WriteLine("\nCreating a new individualEnrollment object...");
            Attestation attestation = new TpmAttestation(TpmEndorsementKey);
            IndividualEnrollment individualEnrollment =
                    new IndividualEnrollment(
                            RegistrationId,
                            attestation);
    
            // The following parameters are optional. Remove them if you don't need them.
            individualEnrollment.DeviceId = OptionalDeviceId;
            individualEnrollment.ProvisioningStatus = OptionalProvisioningStatus;
            #endregion
    
            #region Create the individualEnrollment
            Console.WriteLine("\nAdding the individualEnrollment to the provisioning service...");
            IndividualEnrollment individualEnrollmentResult =
                await provisioningServiceClient.CreateOrUpdateIndividualEnrollmentAsync(individualEnrollment).ConfigureAwait(false);
            Console.WriteLine("\nIndividualEnrollment created with success.");
            Console.WriteLine(individualEnrollmentResult);
            #endregion
    
        }
    }
    
  9. 最后,将 Main 方法替换为以下行:

    static async Task Main(string[] args)
    {
        await RunSample();
        Console.WriteLine("\nHit <Enter> to exit ...");
        Console.ReadLine();
    }
    
  10. 保存所做更改。

提示

为简单起见,此示例使用 SAS 身份验证连接到 DPS 服务 API。 更安全的方法是使用 Azure 令牌凭据。 有关该身份验证方法的示例,请参阅 Node.js SDK 中的create_tpm_enrollment_with_token_credentials.js 示例。

  1. 在工作文件夹的命令窗口中,运行以下命令:

    npm install azure-iot-provisioning-service
    

    此步骤将下载、安装 Azure IoT DPS 服务客户端包及其依赖项,并添加对其的引用。 此包包含 Node.js 服务 SDK 的二进制文件。

  2. 使用文本编辑器,在工作文件夹中创建 create_individual_enrollment.js 文件。 将以下代码添加到该文件:

    'use strict';
    
    var provisioningServiceClient = require('azure-iot-provisioning-service').ProvisioningServiceClient;
    
    var serviceClient = provisioningServiceClient.fromConnectionString(process.argv[2]);
    var endorsementKey = process.argv[3];
    
    var enrollment = {
      registrationId: 'first',
      attestation: {
        type: 'tpm',
        tpm: {
          endorsementKey: endorsementKey
        }
      }
    };
    
    serviceClient.createOrUpdateIndividualEnrollment(enrollment, function(err, enrollmentResponse) {
      if (err) {
        console.log('error creating the individual enrollment: ' + err);
      } else {
        console.log("enrollment record returned: " + JSON.stringify(enrollmentResponse, null, 2));
      }
    });
    
  3. 保存文件。

  1. 打开 Windows 命令提示符。

  2. 克隆适用于 Java 的 Azure IoT SDK GitHub 存储库:

    git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
    
  3. 转到示例文件夹:

    cd azure-iot-sdk-java\provisioning\provisioning-service-client-samples\service-enrollment-sample
    
  4. 在编辑器中打开文件 \src\main\java\samples\com\microsoft\azure\sdk\iot\ServiceEnrollmentSample.java。

  5. 将 [Provisioning Connection String] 替换为在获取适用于预配服务的连接字符串中复制的连接字符串。

    private static final String PROVISIONING_CONNECTION_STRING = "[Provisioning Connection String]";
    
  6. 添加 TPM 设备详细信息。 将以下语句中的 [RegistrationId] 和 [TPM Endorsement Key] 替换为认可密钥和注册 ID。

    private static final String REGISTRATION_ID = "[RegistrationId]";
    private static final String TPM_ENDORSEMENT_KEY = "[TPM Endorsement Key]";
    
    • 如果将本文与< c0>“快速入门:预配模拟的 TPM 设备”文章一起使用来预配模拟设备,请使用在该快速入门中记录的< c1>注册 ID和< c2>背书密钥值。

    • 如果使用本文只是创建一个示例单个注册并且不打算使用它来注册设备,则可以使用以下值作为认可密钥:

      private static final String TPM_ENDORSEMENT_KEY = "AToAAQALAAMAsgAgg3GXZ0SEs/gakMyNRqXXJP1S124GUgtk8qHaGzMUaaoABgCAAEMAEAgAAAAAAAEAxsj2gUScTk1UjuioeTlfGYZrrimExB+bScH75adUMRIi2UOMxG1kw4y+9RW/IVoMl4e620VxZad0ARX2gUqVjYO7KPVt3dyKhZS3dkcvfBisBhP1XH9B33VqHG9SHnbnQXdBUaCgKAfxome8UmBKfe+naTsE5fkvjb/do3/dD6l4sGBwFCnKRdln4XpM03zLpoHFao8zOwt8l/uP3qUIxmCYv9A7m69Ms+5/pCkTu/rK4mRDsfhZ0QLfbzVI6zQFOKF/rwsfBtFeWlWtcuJMKlXdD8TXWElTzgh7JS4qhFzreL0c1mI0GCj+Aws0usZh7dLIVPnefZcBhgy1SSDQMQ==";
      

      输入自己的注册 ID 值。

  7. 对于单个注册,可以选择设置一个设备 ID,DPS 会在将设备预配到 IoT 中心时为该设备分配此 ID。 如果未分配设备 ID,则 DPS 将使用注册 ID 作为设备 ID。 默认情况下,此示例将“myJavaDevice”指定为设备 ID。 若要更改设备 ID,请修改以下语句:

        private static final String DEVICE_ID = "myJavaDevice";
    

    如果您不想指定特定的设备 ID,请将以下语句注释掉:

    individualEnrollment.setDeviceId(DEVICE_ID);
    
  8. 此示例允许你在单个注册项中设置 IoT 中心,以便将设备预配到该中心。 此 IoT 中心必须是以前链接到预配服务的中心。 在本文中,我们让 DPS 根据默认的分配策略(均匀加权分布),从链接中心中进行选择。 将文件中的以下语句注释掉:

    individualEnrollment.setIotHubHostName(IOTHUB_HOST_NAME);
    
  9. 此示例将创建、更新、查询和删除单个 TPM 设备注册。 若要验证是否已在门户中成功完成注册,请将文件末尾的以下代码行暂时注释掉:

    // *********************************** Delete info of individualEnrollment ************************************
    System.out.println("\nDelete the individualEnrollment...");
    provisioningServiceClient.deleteIndividualEnrollment(REGISTRATION_ID);
    
  10. 保存所做更改。

运行单个注册示例

  1. 运行示例:

    dotnet run
    
  2. 成功创建以后,命令窗口会显示新注册的属性。

若要运行示例,需要在上一部分中复制的预配服务连接字符串以及设备的认可密钥。 如果遵循 快速入门:预配模拟的 TPM 设备 文章以创建模拟 TPM 设备,请使用为该设备创建的认可密钥。 否则,若要创建示例单个注册,可以使用 Node.js 服务 SDK 随附的以下许可密钥:

AToAAQALAAMAsgAgg3GXZ0SEs/gakMyNRqXXJP1S124GUgtk8qHaGzMUaaoABgCAAEMAEAgAAAAAAAEAxsj2gUScTk1UjuioeTlfGYZrrimExB+bScH75adUMRIi2UOMxG1kw4y+9RW/IVoMl4e620VxZad0ARX2gUqVjYO7KPVt3dyKhZS3dkcvfBisBhP1XH9B33VqHG9SHnbnQXdBUaCgKAfxome8UmBKfe+naTsE5fkvjb/do3/dD6l4sGBwFCnKRdln4XpM03zLpoHFao8zOwt8l/uP3qUIxmCYv9A7m69Ms+5/pCkTu/rK4mRDsfhZ0QLfbzVI6zQFOKF/rwsfBtFeWlWtcuJMKlXdD8TXWElTzgh7JS4qhFzreL0c1mI0GCj+Aws0usZh7dLIVPnlgZcBhgy1SSDQMQ==
  1. 若要为 TPM 设备进行单独注册,请运行以下命令(请保留命令参数两侧的引号):

    node create_individual_enrollment.js "<the connection string for your provisioning service>" "<endorsement key>"
    
  2. 成功创建以后,命令窗口会显示新注册的属性。

  1. 在命令提示符中,进入 azure-iot-sdk-java\provisioning\provisioning-service-client-samples\service-enrollment-sample 文件夹,然后运行以下命令来构建该示例:

    mvn install -DskipTests
    

    此命令将 Azure IoT DPS 服务客户端 Maven 包下载到计算机并生成示例。 此包包含 Java 服务 SDK 的二进制文件。

  2. 切换到 target 文件夹并运行示例。 上一步构建生成的 .jar 文件会输出到 target 文件夹中,文件名格式如下:service-enrollment-sample-{version}-with-deps.jar;例如:service-enrollment-sample-1.8.1-with-deps.jar。 可能需要替换以下命令中的版本。

    cd target
    java -jar ./service-enrollment-sample-1.8.1-with-deps.jar
    
  3. 成功创建以后,命令窗口会显示新注册的属性。

若要验证个人用户注册是否已创建,请执行以下步骤:

  1. 在 Azure 门户中导航到你的设备预配服务实例。

  2. 在服务菜单中的 “设置”下,选择“ 管理注册”。

  3. 选择“单独注册”选项卡。你应会看到一个对应于示例中使用的注册 ID 的新注册条目。

    屏幕截图显示了如何在门户中验证单个设备的注册。

注册模拟设备(可选)

如果你已按照快速入门:预配模拟的 TPM 设备一文中的步骤预配了模拟设备,请在注册设备部分继续快速入门。

如果你已按照快速入门:预配模拟的 TPM 设备一文中的步骤预配了模拟设备,请在注册设备部分继续快速入门。

如果你已按照快速入门:预配模拟的 TPM 设备一文中的步骤预配了模拟设备,请在注册设备部分继续快速入门。

清理资源

如果您计划进一步学习 DPS 教程,请不要删除本文中创建的资源。 否则,请执行以下步骤删除本文中创建的所有资源。

  1. 在 Azure 门户中导航到你的设备预配服务实例。

  2. 在服务菜单中的 “设置”下,选择“ 管理注册”。

  3. 选择“单个注册”选项卡。

  4. 选中在本文中创建的注册条目的注册 ID 旁边的复选框。

  5. 在窗格顶部,选择“删除”。

  1. 如果您遵循“快速入门指南:预配模拟 TPM 设备”中的步骤创建了一个模拟 TPM 设备,请执行以下步骤:

    1. 在 Azure 门户中,导航到预配设备的 IoT 中心。

    2. 在“服务”菜单中的 “设备管理”下,选择“ 设备”。

    3. 选中您在本文中注册的设备的“设备 ID”旁边的复选框。

    4. 在窗格顶部,选择“删除”。

  1. 如果您遵循“快速入门指南:预配模拟 TPM 设备”中的步骤创建了一个模拟 TPM 设备,请执行以下步骤:

    1. 关闭 TPM 模拟器窗口以及模拟设备的示例输出窗口。

    2. 在 Azure 门户中,导航到预配设备的 IoT 中心。

    3. 在“服务”菜单中的 “设备管理”下,选择“ 设备”。

    4. 选中本文中注册的设备 ID 旁边的复选框。

    5. 在窗格顶部,选择“删除”。

  1. 如果您遵循“快速入门指南:预配模拟 TPM 设备”中的步骤创建了一个模拟 TPM 设备,请执行以下步骤:

    1. 关闭 TPM 模拟器窗口以及模拟设备的示例输出窗口。

    2. 在 Azure 门户中,导航到预配设备的 IoT 中心。

    3. 在“服务”菜单中的 “设备管理”下,选择“ 设备”。

    4. 选中本文中注册的设备 ID 旁边的复选框。

    5. 在窗格顶部,选择“删除”。

后续步骤

在本文中,你采用编程方式为 TPM 设备创建了单个注册条目。 此外,你已根据需要在计算机上创建了一个 TPM 模拟设备,并已使用 Azure IoT 中心设备预配服务将其预配到 IoT 中心。 若要进一步探索,请查看以下链接: