TPM 構成証明のための Device Provisioning Service 個別登録をプログラムで作成する

この記事では、Azure IoT Hub DPS サービス SDK とサンプル アプリケーションを使用して、Azure IoT Hub Device Provisioning Service で TPM デバイスの個々の登録をプログラムによって作成する方法について説明します。 個々の登録を作成した後、この登録エントリを使用して、シミュレートされた TPM デバイスをプロビジョニング サービスに必要に応じて登録できます。

これらの手順は Windows コンピューターと Linux コンピューターの両方に利用できますが、この記事では Windows 開発コンピューターを使用します。

前提条件

  • Windows ベースのマシンに .NET 6.0 SDK 以降をインストールします。 次のコマンドを使用してバージョンを確認してください。

    dotnet --info
    
  • (省略可能) この記事の最後でシミュレートされたデバイスを登録する場合は、デバイスの保証キーを取得する手順まで、シミュレートされた TPM デバイスの作成とプロビジョニングに関するページの手順に従います。 保証キーを保存します。この記事の後半でこれを使用します。

    Note

    Azure portal を使用して個々の登録を作成する手順は行わないでください。

  • Node.js v4.0 以降をインストールします。

  • (省略可能) この記事の最後でシミュレートされたデバイスを登録する場合は、デバイスの保証キーと登録 ID を取得する手順まで、シミュレートされた TPM デバイスの作成とプロビジョニングに関するページの手順に従います。 保証キー登録 ID を保存します。この記事の後半でこれらを使用します。

    Note

    Azure portal を使用して個々の登録を作成する手順は行わないでください。

  • Java SE Development Kit 8 をインストールします。 この記事では、後半で Java サービス SDK をインストールします。 Windows と Linux のどちらでも使用できます。 この記事では、Windows を使用します。

  • Maven 3 のインストール。

  • Git をインストールし、パスが環境変数 PATH に追加されていることを確認します。

  • (省略可能) この記事の最後でシミュレートされたデバイスを登録する場合は、デバイスの保証キーを取得する手順まで、シミュレートされた TPM デバイスの作成とプロビジョニングに関するページの手順に従います。 保証キー登録 ID をメモします。この記事の後半でこれらを使用します。

    Note

    Azure portal を使用して個々の登録を作成する手順は行わないでください。

TPM 保証キーを取得する (省略可能)

この記事の手順に従うと、サンプルの個別登録を作成できます。 この場合、DPS で登録エントリを表示できますが、これをデバイスのプロビジョニングに使用することはできません。

また、この記事の手順に従うと、個々の登録を作成し、シミュレートされた TPM デバイスを登録できます。 この記事の最後でシミュレートされたデバイスを登録する場合は、デバイスの保証キーを取得する手順まで、シミュレートされた TPM デバイスの作成とプロビジョニングに関するページの手順に従います。 保証キーを保存します。この記事の後半でこれを使用します。

Note

Azure portal を使用して個々の登録を作成する手順は行わないでください。

また、この記事の手順に従うと、個々の登録を作成し、シミュレートされた TPM デバイスを登録できます。 この記事の最後でシミュレートされたデバイスを登録する場合は、デバイスの保証キーと登録 ID を取得する手順まで、シミュレートされた TPM デバイスの作成とプロビジョニングに関するページの手順に従います。 保証キー登録 ID を保存します。この記事の後半でこれらを使用します。

Note

Azure portal を使用して個々の登録を作成する手順は行わないでください。

また、この記事の手順に従うと、個々の登録を作成し、シミュレートされた TPM デバイスを登録できます。 この記事の最後でシミュレートされたデバイスを登録する場合は、デバイスの保証キーを取得する手順まで、シミュレートされた TPM デバイスの作成とプロビジョニングに関するページの手順に従います。 保証キー登録 ID をメモします。この記事の後半でこれらを使用します。

Note

Azure portal を使用して個々の登録を作成する手順は行わないでください。

プロビジョニング サービスの接続文字列を取得する

この記事のサンプルでは、プロビジョニング サービスの接続文字列をコピーする必要があります。

  1. Azure portal にサインインします。

  2. 左側のメニューまたはポータル ページで、 [すべてのリソース] を選択します。

  3. ご利用の Device Provisioning Service を選択します。

  4. [設定] メニューから、[共有アクセス ポリシー] を選択します。

  5. 使用するアクセス ポリシーを選択します。

  6. [アクセス ポリシー] パネルで、主キーの接続文字列をコピーして保存します。

    Get provisioning service connection string from the portal.

個々の登録サンプルを作成する

このセクションでは、TPM デバイスの個々の登録をご利用のプロビジョニング サービスに追加する .NET Core コンソール アプリを作成する方法について説明します。

  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 ステートメントを以下に置き換えます。

    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 クラスに追加します。 このコードにより、個々の登録エントリが作成され、その後 ProvisioningServiceClientCreateOrUpdateIndividualEnrollmentAsync メソッドが呼び出され、個々の登録がプロビジョニング サービスに追加されます。

    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 用 Microsoft 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. 個々の登録では、DPS がデバイスを IoT Hub にプロビジョニングするときにデバイスに割り当てるデバイス ID を設定できます。 デバイス ID を割り当てない場合、DPS はデバイス ID として登録 ID を使用します。 既定では、このサンプルではデバイス ID として "myJavaDevice" が割り当てられます。 デバイス ID を変更する場合は、次のステートメントを変更します。

        private static final String DEVICE_ID = "myJavaDevice";
    

    特定のデバイス ID を割り当てない場合は、次のステートメントをコメント アウトします。

    individualEnrollment.setDeviceId(DEVICE_ID);
    
  8. このサンプルでは、個々の登録でデバイスをプロビジョニングする先の IoT Hub を設定できます。 この 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 Service 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 portal で Device Provisioning Service インスタンスに移動します。

  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 portal で Device Provisioning Service インスタンスに移動します。

  2. [設定] メニューで [登録の管理] を選択します。

  3. [個別の登録] タブを選択します。

  4. この記事で作成した登録エントリの登録 ID の横にあるチェック ボックスをオンにします。

  5. ページの上部で、[削除] を選択します。

  1. シミュレートされた TPM デバイスの作成とプロビジョニングに関するページの手順に従って、シミュレートされた TPM デバイスを作成した場合は、次の手順に従います。

    1. Azure Portal で、デバイスがプロビジョニングされた IoT ハブに移動します。

    2. 左側のメニューの [デバイスの管理] で、[デバイス] を選択します。

    3. この記事で登録したデバイスの "デバイス ID" の横にあるチェック ボックスをオンにします。

    4. ウィンドウの上部にある [削除] を選択します。

  1. シミュレートされた TPM デバイスの作成とプロビジョニングに関するページの手順に従って、シミュレートされた TPM デバイスを作成した場合は、次の手順に従います。

    1. TPM シミュレーター ウィンドウと、シミュレートされたデバイスのサンプル出力ウィンドウを閉じます。

    2. Azure Portal で、デバイスがプロビジョニングされた IoT ハブに移動します。

    3. 左側のメニューの [デバイスの管理] で、[デバイス] を選択します。

    4. この記事で登録したデバイスのデバイス ID の横にあるチェック ボックスをオンにします。

    5. ウィンドウの上部にある [削除] を選択します。

  1. シミュレートされた TPM デバイスの作成とプロビジョニングに関するページの手順に従って、シミュレートされた TPM デバイスを作成した場合は、次の手順に従います。

    1. TPM シミュレーター ウィンドウと、シミュレートされたデバイスのサンプル出力ウィンドウを閉じます。

    2. Azure Portal で、デバイスがプロビジョニングされた IoT ハブに移動します。

    3. 左側のメニューの [デバイスの管理] で、[デバイス] を選択します。

    4. この記事で登録したデバイスのデバイス ID の横にあるチェック ボックスをオンにします。

    5. ウィンドウの上部にある [削除] を選択します。

次のステップ

この記事では、TPM デバイスの個々の登録エントリをプログラムで作成しました。 必要に応じて、TPM のシミュレートされたデバイスをご利用のコンピューター上に作成し、それを Azure IoT Hub Device Provisioning Service を使用して IoT ハブにプロビジョニングしました。 さらに学習するために、次のリンクを確認してください。