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

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

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

先决条件

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

    dotnet --info
    
  • (可选)如需在本文末尾注册模拟设备,请执行创建和预配模拟的 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 门户创建单个注册的步骤。

获取 TPM 认可密钥(可选)

可以按照本文中的步骤,创建示例单个注册。 这种情况下,你将能够在 DPS 中查看注册条目,但无法使用它来预配设备。

也可以选择按照本文中的步骤创建单个注册,并注册模拟的 TPM 设备。 如需在本文末尾注册模拟设备,请执行创建和预配模拟的 TPM 设备中的过程,一直到获取设备的认可密钥那一步。 保存“认可密钥”,因为稍后需要在本文中使用。

注意

请勿执行使用 Azure 门户创建单个注册的步骤。

也可以选择按照本文中的步骤创建单个注册,并注册模拟的 TPM 设备。 如需在本文末尾注册模拟设备,请执行创建和预配模拟的 TPM 设备中的过程,一直到获取设备的认可密钥和注册 ID 那一步。 保存“认可密钥”和“注册 ID”,因为稍后需要在本文中使用。

注意

请勿执行使用 Azure 门户创建单个注册的步骤。

也可以选择按照本文中的步骤创建单个注册,并注册模拟的 TPM 设备。 如需在本文末尾注册模拟设备,请执行创建和预配模拟的 TPM 设备中的过程,一直到获取设备的认可密钥那一步。 请记下“认可密钥”和“注册 ID”,因为稍后需要在本文中使用。

注意

请勿执行使用 Azure 门户创建单个注册的步骤。

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

对于本文中的示例,需要复制适用于你的预配服务的连接字符串。

  1. 登录 Azure 门户

  2. 在门户页面的左侧菜单中,选择“所有资源”。

  3. 选择你的设备预配服务。

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

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

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

    Get provisioning service connection string from the portal.

创建单个注册示例

本部分介绍如何创建一个 .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. 在文件顶部(namespace 语句之上)添加以下 using 语句:

    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 类。 此代码创建单个注册条目,然后调用 ProvisioningServiceClient 中的 CreateOrUpdateIndividualEnrollmentAsync 方法,将单个注册添加到预配服务。

    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. 保存所做更改。

  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]";
    
    • 如果将本文与创建和预配模拟的 TPM 设备快速入门结合使用来预配模拟设备,则请使用从该快速入门中记录的“注册 ID”和“认可密钥”值。

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

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

      输入自己的注册 ID 值,例如“myJavaDevice”。

  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 设备,请使用为该设备创建的认可密钥。 否则,若要创建示例单个注册,可以使用 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 文件夹并运行示例。 上一步中的生成会在 target 文件夹中输出使用以下文件格式的 .jar 文件: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 的新注册条目。

Screenshot that shows verifying enrollment for a C# individual device in the portal.

Screenshot that shows verifying enrollment for a Node.js individual device in the portal.

Screenshot that shows verifying enrollment for a Java individual device in the portal.

注册模拟设备(可选)

如果一直按照创建和预配模拟的 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 中心。 若要进一步探索,请查看以下链接: