クイックスタート: シミュレートされた X.509 証明書デバイスをプロビジョニングする

このクイックスタートでは、シミュレートされたデバイスを Windows マシンに作成します。 シミュレートされたデバイスは、認証のために X.509 証明書の構成証明メカニズムを使用するように構成されます。 デバイスを構成した後、Azure IoT Hub Device Provisioning Service を使用して IoT ハブにプロビジョニングします。

プロビジョニングのプロセスに慣れていない場合は、プロビジョニングの概要を確認してください。 また、先に進む前に、Azure Portal での IoT Hub Device Provisioning Service の設定に関するページの手順も済ませておいてください。

このクイックスタートでは、Windows ベース ワークステーションのソリューションについて説明します。 しかし、Linux でこの手順を行うこともできます。 Linux の例については、「チュートリアル: geo 待機時間のためのプロビジョニング」を参照してください。

前提条件

Windows 開発環境の前提条件は次のとおりです。 Linux または macOS については、SDK ドキュメントの「開発環境を準備する」の該当するセクションを参照してください。

  • 'C++ によるデスクトップ開発' ワークロードを有効にした Visual Studio 2022 をインストールします。 Visual Studio 2015、Visual Studio 2017、および Visual Studio 19 もサポートされています。 Linux または macOS については、SDK ドキュメントの「開発環境を準備する」の該当するセクションを参照してください。

  • 最新の CMake ビルド システムをインストールします。 CMake 実行可能ファイルをパスに追加するオプションを必ずオンにします。

    重要

    CMake のインストールを開始する前に、Visual Studio の前提条件 (Visual Studio と "C++ によるデスクトップ開発" ワークロード) がコンピューターにインストールされていることを確認します。 前提条件を満たし、ダウンロードを検証したら、CMake ビルド システムをインストールします。 また、以前のバージョンの CMake ビルド システムでは、この記事で使用されているソリューション ファイルを生成できないことに注意してください。 必ず最新バージョンの CMake を使用してください。

Windows 開発環境の前提条件は次のとおりです。 Linux または macOS については、SDK ドキュメントの「開発環境を準備する」の該当するセクションを参照してください。

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

    dotnet --info
    

Windows 開発環境の前提条件は次のとおりです。 Linux または macOS については、SDK ドキュメントの「開発環境を準備する」の該当するセクションを参照してください。

Windows 開発環境の前提条件は次のとおりです。

Windows 開発環境の前提条件は次のとおりです。 Linux または macOS については、SDK ドキュメントの「開発環境を準備する」の該当するセクションを参照してください。

  • コンピューターに Java SE Development Kit 8 以降をインストールします。

  • Maven をダウンロードし、インストールします。

  • 最新バージョンの Git をインストールします。 コマンド ウィンドウからアクセスできる環境変数に Git が追加されていることを確認します。 Git Bash (ローカル Git リポジトリとやりとりする際に使用できるコマンドライン アプリ) を含む、インストールする git ツールの最新バージョンについては、Software Freedom Conservancy の Git クライアント ツールに関するページを参照してください。

  • OpenSSL がコンピューターにインストールされていることを確認します。 Windowsでは、Git のインストールに OpenSSL のインストールが含まれています。 OpenSSL には、Git Bash プロンプトからアクセスできます。 OpenSSL がインストールされていることを確認するには、Git Bash プロンプトを開いて、openssl version と入力します。

    注意

    OpenSSL に精通していて、既に Windows コンピューターにインストールしている場合を除き、Git Bash プロンプトから OpenSSL を使用することをお勧めします。 または、ソース コードをダウンロードして OpenSSL をビルドすることもできます。 詳細については、「OpenSSL のダウンロード」ページをご覧ください。 または、事前構築済み OpenSSL をサードパーティからダウンロードすることもできます。 詳細については、OpenSSL Wiki を参照してください。 Microsoft は、サード パーティからダウンロードされたパッケージの有効性について何ら保証しません。 OpenSSL をビルドまたはダウンロードする場合は、パスで OpenSSL バイナリにアクセスできること、および OPENSSL_CNF 環境変数が openssl.cnf ファイルのパスに設定されていることを確認してください。

  • Windows コマンド プロンプトと Git Bash プロンプトの両方を開きます。

    このクイック スタートの手順では、Windows コンピューターと、Git の一部としてインストールされている OpenSSL インストールを使用していることを前提としています。 Git Bash プロンプトを使用して OpenSSL コマンドを発行し、Windows コマンド プロンプトは他のすべてのコマンドに使用します。 Linux を使用している場合は、すべてのコマンドを Bash シェルから発行できます。

開発環境を準備する

このセクションでは、Azure IoT C SDK のビルドに使用する開発環境を準備します。 このサンプル コードでは、デバイスのブート シーケンス中にデバイスのプロビジョニングを試みます。

  1. Web ブラウザーを開き、Azure IoT C SDK のリリース ページに移動します。

  2. そのページの上部にある [タグ] タブを選択します。

  3. 最新リリースの Azure IoT C SDK のタグ名をコピーします。

  4. Windows コマンド プロンプトで、次のコマンドを実行して、最新リリースの C 用 Azure IoT Device SDK の GitHub リポジトリを複製します。 <release-tag> を前のステップでコピーしたタグで置き換えます (例: lts_01_2023)。

    git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git
    cd azure-iot-sdk-c
    git submodule update --init
    

    この操作が完了するまで数分かかる場合があります。

  5. 操作が完了したら、azure-iot-sdk-c ディレクトリから次のコマンドを実行します。

    mkdir cmake
    cd cmake
    
  6. このコード サンプルでは、X.509 証明書を使用し、X.509 認証によって構成証明を提示します。 次のコマンドを実行して、デバイス プロビジョニング クライアントを含む開発プラットフォームに固有の SDK のバージョンをビルドします。 シミュレートされたデバイスの Visual Studio ソリューションが cmake ディレクトリに生成されます。

    次のコマンドの -Dhsm_custom_lib で使用するパスを指定する場合は、必ず、以前に作成した cmake ディレクトリ内のライブラリへの絶対パスを使用してください。 示されているパスは、C ドライブのルート ディレクトリに C SDK を複製したことを前提としています。 別のディレクトリを使用した場合は、それに応じてパスを調整してください。

    cmake -Duse_prov_client:BOOL=ON -Dhsm_custom_lib=c:/azure-iot-sdk-c/cmake/provisioning_client/samples/custom_hsm_example/Debug/custom_hsm_example.lib ..
    

ヒント

cmake で C++ コンパイラが見つからない場合は、上記のコマンドの実行中にビルド エラーが発生する可能性があります。 これが発生した場合は、Visual Studio コマンド プロンプトでコマンドを実行してください。

  1. ビルドが成功すると、最後のいくつかの出力行は次の出力のようになります。

    -- Building for: Visual Studio 17 2022
    -- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.22000.
    -- The C compiler identification is MSVC 19.32.31329.0
    -- The CXX compiler identification is MSVC 19.32.31329.0
    
    ...
    
    -- Configuring done
    -- Generating done
    -- Build files have been written to: C:/azure-iot-sdk-c/cmake
    

Windows コマンド プロンプトで、次のコマンドを使用して、Azure IoT SDK for C# の GitHub リポジトリをクローンします。

git clone https://github.com/Azure/azure-iot-sdk-csharp.git

Windows コマンド プロンプトで、次のコマンドを使用して、Node.js 用 Azure IoT SDK の GitHub リポジトリを複製します。

git clone https://github.com/Azure/azure-iot-sdk-node.git

Windows コマンド プロンプトで、次のコマンドを使用して、Python 用 Azure IoT Device SDK の GitHub リポジトリを複製します。

git clone -b v2 https://github.com/Azure/azure-iot-sdk-python.git --recursive

注意

このチュートリアルで使用するサンプルは、azure-iot-sdk-python リポジトリの v2 ブランチにあります。 Python SDK の V3 はベータ版で使用できます。

  1. Windows コマンドプロンプトで、次のコマンドを使用して、Java 用 Azure IoT サンプルの GitHub リポジトリを複製します。

    git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
    
  2. ルート azure-iot-sdk-java ディレクトリに移動し、プロジェクトをビルドして必要なパッケージをすべてダウンロードします。

    cd azure-iot-sdk-java
    mvn install -DskipTests=true
    

自己署名 X.509 デバイス証明書を作成する

このセクションでは、OpenSSL を使用して、自己署名 X.509 証明書と秘密キーを作成します。 この証明書はプロビジョニング サービス インスタンスにアップロードされて、サービスによって検証されます。

注意事項

このクイック スタートで OpenSSL で作成した証明書は、開発テストだけに使用してください。 運用環境ではこれらの証明書を使用しないでください。 これらの証明書は 30 日後に期限切れになり、ハードコーディングされたパスワード (1234 など) が含まれる場合があります。 運用環境での使用に適した証明書の取得について詳しくは、Azure IoT Hub ドキュメントの「X.509 CA 証明書の入手方法」をご覧ください。

このセクションの手順を、Git Bash プロンプトで実行します。

  1. Git Bash プロンプトで、証明書を作成するディレクトリに移動します。

  2. 次のコマンドを実行します。

    winpty openssl req -outform PEM -x509 -sha256 -newkey rsa:4096 -keyout device-key.pem -out device-cert.pem -days 30 -extensions usr_cert -addext extendedKeyUsage=clientAuth -subj "//CN=my-x509-device"
    

    重要

    サブジェクト名 (//CN=my-x509-device) に追加されているスラッシュは、Windows プラットフォーム上の Git で文字列をエスケープする場合にのみ必要となります。

  3. PEM のパス フレーズを入力するよう求められたら、パス フレーズ 1234 を使用します。

  4. PEM パス フレーズの確認入力を求められたら、同じパス フレーズ 1234 をもう一度使用します。

    これで、openssl コマンドを実行したディレクトリに、公開キー証明書ファイル (device-cert.pem) と秘密キー ファイル (device-key.pem) が生成されるはずです。

    証明書ファイルのサブジェクト共通名 (CN) は my-x509-device に設定されています。 X.509 ベースの登録では、登録 ID は共通名に設定されます。 登録 ID は、英数字と特殊文字 ('-''.''_'':') から成る、大文字と小文字が区別されない文字列です。 最後の文字は、英数字またはダッシュ ('-') である必要があります。 共通名は、この形式に従う必要があります。 DPS では、最大 128 文字の登録 ID がサポートされます。ただし、X.509 証明書のサブジェクト共通名の最大長は 64 文字です。 したがって、X.509 証明書を使用する場合、登録 ID は 64 文字に制限されます。

  5. 証明書ファイルは Base 64 でエンコードされています。 証明書ファイルのサブジェクト共通名 (CN) と他のプロパティを表示するには、次のコマンドを入力します。

    winpty openssl x509 -in device-cert.pem -text -noout
    
    Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            77:3e:1d:e4:7e:c8:40:14:08:c6:09:75:50:9c:1a:35:6e:19:52:e2
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = my-x509-device
        Validity
            Not Before: May  5 21:41:42 2022 GMT
            Not After : Jun  4 21:41:42 2022 GMT
        Subject: CN = my-x509-device
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:
                    00:d2:94:37:d6:1b:f7:43:b4:21:c6:08:1a:d6:d7:
                    e6:40:44:4e:4d:24:41:6c:3e:8c:b2:2c:b0:23:29:
                    ...
                    23:6e:58:76:45:18:03:dc:2e:9d:3f:ac:a3:5c:1f:
                    9f:66:b0:05:d5:1c:fe:69:de:a9:09:13:28:c6:85:
                    0e:cd:53
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                63:C0:B5:93:BF:29:F8:57:F8:F9:26:44:70:6F:9B:A4:C7:E3:75:18
            X509v3 Authority Key Identifier:
                keyid:63:C0:B5:93:BF:29:F8:57:F8:F9:26:44:70:6F:9B:A4:C7:E3:75:18
    
            X509v3 Extended Key Usage:
                TLS Web Client Authentication
    Signature Algorithm: sha256WithRSAEncryption
         82:8a:98:f8:47:00:85:be:21:15:64:b9:22:b0:13:cc:9e:9a:
         ed:f5:93:b9:4b:57:0f:79:85:9d:89:47:69:95:65:5e:b3:b1:
         ...
         cc:b2:20:9a:b7:f2:5e:6b:81:a1:04:93:e9:2b:92:62:e0:1c:
         ac:d2:49:b9:36:d2:b0:21
    
  1. サンプル コードには、暗号化されていない秘密キーが必要です。 次のコマンドを実行して、暗号化されていない秘密キーを作成します。

    winpty openssl rsa -in device-key.pem -out unencrypted-device-key.pem
    
  2. device-key.pem: のパス フレーズを入力するように求められたら、前に行ったのと同じパス フレーズ 1234 を使用します。

Git Bash プロンプトを開いたままにします。 後ほど、このクイックスタートで必要になります。

C# サンプル コードは、パスワードで保護された PKCS#12 形式のファイル (certificate.pfx) に格納された X.509 証明書を使用するように設定されています。 作成したばかりの PEM 形式の公開キー証明書ファイル (device-cert.pem) は、このクイックスタートの後半で個々の登録エントリを作成するためにまだ必要です。

  1. サンプルで想定される PKCS12 形式のファイルを生成するには、次のコマンドを入力します。

    winpty openssl pkcs12 -inkey device-key.pem -in device-cert.pem -export -out certificate.pfx
    
  2. device-key.pem: のパス フレーズを入力するように求められたら、前に行ったのと同じパス フレーズ 1234 を使用します。

  3. エクスポート パスワードの入力を求められたら、パスワード 1234 を使用します。

  4. [確認 - エクスポート パスワードの入力:] というメッセージが表示されたら、パスワード 1234 をもう一度使用します。

    PKCS12 形式の証明書ファイル (certificate.pfx) が、openssl コマンドを実行したディレクトリに生成されるはずです。

  5. PKCS12 形式の証明書ファイルを X.509 デバイス プロビジョニング サンプルのプロジェクト ディレクトリにコピーします。 指定されたパスは、サンプル リポジトリをダウンロードした場所と相対しています。

    cp certificate.pfx ./azure-iot-sdk-csharp/provisioning/device/samples/"Getting Started"/X509Sample
    

Git Bash プロンプトは、このクイックスタートの残りの部分では必要ありません。 ただし、このプロンプトを開いたままにして、後の手順で問題が発生した場合に証明書を確認することができます。

  1. サンプル コードには、暗号化されていない秘密キーが必要です。 次のコマンドを実行して、暗号化されていない秘密キーを作成します。

    winpty openssl rsa -in device-key.pem -out unencrypted-device-key.pem
    
  2. device-key.pem: のパス フレーズを入力するように求められたら、前に行ったのと同じパス フレーズ 1234 を使用します。

  3. デバイス証明書と暗号化されていない秘密キーを、X.509 デバイス プロビジョニング サンプルのプロジェクト ディレクトリにコピーします。 指定されたパスは、SDK をダウンロードした場所と相対しています。

    cp device-cert.pem ./azure-iot-sdk-node/provisioning/device/samples
    cp unencrypted-device-key.pem ./azure-iot-sdk-node/provisioning/device/samples
    

Git Bash プロンプトは、このクイックスタートの残りの部分では必要ありません。 ただし、このプロンプトを開いたままにして、後の手順で問題が発生した場合に証明書を確認することができます。

  1. デバイス証明書と秘密キーを、X.509 デバイス プロビジョニング サンプルのプロジェクト ディレクトリにコピーします。 指定されたパスは、SDK をダウンロードした場所と相対しています。

    cp device-cert.pem ./azure-iot-sdk-python/samples/async-hub-scenarios
    cp device-key.pem ./azure-iot-sdk-python/samples/async-hub-scenarios
    

Git Bash プロンプトは、このクイックスタートの残りの部分では必要ありません。 ただし、このプロンプトを開いたままにして、後の手順で問題が発生した場合に証明書を確認することができます。

  1. Java サンプル コードには、暗号化されていない秘密キーが必要です。 次のコマンドを実行して、暗号化されていない秘密キーを作成します。

    winpty openssl pkey -in device-key.pem -out unencrypted-device-key.pem
    
  2. device-key.pem: のパス フレーズを入力するように求められたら、前に行ったのと同じパス フレーズ 1234 を使用します。

Git Bash プロンプトを開いたままにします。 後ほど、このクイックスタートで必要になります。

デバイス登録を作成する

Azure IoT Device Provisioning Service では、次の 2 種類の登録がサポートされています。

  • 登録グループ:複数の関連するデバイスを登録するために使用します。
  • 個別登録: 単一デバイスを登録するために使用します。

この記事では、IoT ハブに単一のデバイスをプロビジョニングする個別登録のデモを行います。

  1. Azure portal にサインインし、Device Provisioning Service インスタンスに移動します。

  2. ナビゲーション メニューの [設定] セクションから [Manage enrollments] (登録の管理) を選択します。

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

    Screenshot that shows the add individual enrollment option.

  4. [登録の追加] ページの [登録とプロビジョニング] で、次の情報を入力して登録の詳細を構成します。

    フィールド 説明
    構成証明 [構成証明メカニズム] として [X.509 クライアント証明書] を選択します。
    X.509 クライアント証明書 この登録のデバイスの検証に使用される 1 つまたは 2 つの証明書をアップロードします。
    プロビジョニング状態 この登録をデバイスのプロビジョニングに使用できるようにする場合は、[この登録を有効にする] チェック ボックスをオンにします。 登録を無効にする場合は、このチェック ボックスをオフにします。 この設定は後で変更できます。
    再プロビジョニング ポリシー 再プロビジョニングを要求するデバイスを DPS で処理する方法を反映する再プロビジョニング ポリシーを選択します。 詳細については、再プロビジョニング ポリシーに関するページを参照してください。
  5. [Next: IoT hubs] (次へ: IoT ハブ) を選択します。

  6. [登録の追加] ページの [IoT ハブ] タブで、次の情報を入力して、登録でデバイスをプロビジョニングできる IoT ハブを決定します。

    フィールド 説明
    Target IoT hubs (ターゲット IoT ハブ) 1 つ以上のリンクされた IoT ハブを選択するか、IoT ハブへの新しいリンクを追加します。 IoT ハブを DPS インスタンスにリンクする方法の詳細については、IoT ハブをリンクして管理する方法に関するページを参照してください。
    割り当てポリシー 複数のリンクされた IoT ハブを選択した場合は、デバイスを別のハブに割り当てる方法を選択します。 割り当てポリシーの詳細については、割り当てポリシーの使用方法に関するページを参照してください。

    リンクされた IoT ハブを 1 つだけ選択した場合は、加重が均等に分布ポリシーを使用することをお勧めします。
  7. [次へ: デバイスの設定] を選択します

  8. [登録の追加] ページの [デバイス設定] タブで、次の情報を入力して、新しくプロビジョニングされたデバイスの構成方法を定義します。

    フィールド 説明
    Device ID IoT Hub でプロビジョニングされたデバイスに割り当てられるデバイス ID を指定します。 デバイス ID を指定しなかった場合は、登録 ID が使用されます。
    IoT Edge プロビジョニングされたデバイスで Azure IoT Edge が実行される場合は、[プロビジョニングされたデバイスで IoT Edge を有効にする] をオンにします。 この登録が非 IoT Edge 対応デバイス用である場合は、このボックスをオフにします。
    デバイス タグ このテキスト ボックスを使用して、プロビジョニングされたデバイスのデバイス ツインに適用するタグを指定します。
    必要なプロパティ このテキスト ボックスを使用して、プロビジョニングされたデバイスのデバイス ツインに適用する必要なプロパティを指定します。

    詳細については、「IoT Hub のデバイス ツインの理解と使用」を参照してください。

  9. 確認と作成 をクリックします。

  10. [確認 + 作成] タブで、すべての値を確認してから [作成] を選択します。

デバイス プロビジョニング コードを準備して実行する

このセクションでは、デバイスのブート シーケンスを Device Provisioning Service インスタンスに送信するようにサンプル コードを更新します。 このブート シーケンスにより、デバイスが認識されて、DPS インスタンスにリンクされた IoT ハブに割り当てられます。

このセクションでは、Git Bash プロンプトと Visual Studio IDE を使用します。

デバイスのプロビジョニング コードを構成する

このセクションでは、Device Provisioning Service インスタンス情報を使用してサンプル コードを更新します。

  1. Azure portal で、Device Provisioning Service の [概要] タブを選択します。

  2. [ID スコープ] の値をコピーします。

    Screenshot of the ID scope on Azure portal.

  3. Visual Studio を起動し、Git リポジトリ azure-iot-sdk-c のルートに作成した cmake ディレクトリに作成された新しいソリューション ファイルを開きます。 ソリューション ファイルの名前は azure_iot_sdks.sln です。

  4. Visual Studio のソリューション エクスプローラーで [Provision_Samples] > [prov_dev_client_sample] > [ソース ファイル]の順に移動し、prov_dev_client_sample.c を開きます。

  5. 定数 id_scope を探し、手順 2 でコピーした ID スコープの値で置き換えます。

    static const char* id_scope = "0ne00000A0A";
    
  6. 同じファイル内で main() 関数の定義を探します。 hsm_type 変数が SECURE_DEVICE_TYPE_X509 に設定されていることを確認します。

    SECURE_DEVICE_TYPE hsm_type;
    //hsm_type = SECURE_DEVICE_TYPE_TPM;
    hsm_type = SECURE_DEVICE_TYPE_X509;
    //hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
    
  7. 変更を保存します。

  8. prov_dev_client_sample プロジェクトを右クリックし、[スタートアップ プロジェクトに設定] を選択します。

カスタム HSM スタブ コードを構成する

実際のハードウェアベースのストレージとやり取りする際の詳細は、ハードウェアに応じて異なります。 その結果、このクイック スタートでシミュレートされたデバイスで使用される証明書と秘密キーは、カスタム ハードウェア セキュリティ モジュール (HSM) スタブ コードでハードコーディングされます。

ID my-x509-device でデバイスの ID をシミュレートするようにカスタム HSM スタブ コードを更新するには:

  1. Visual Studio のソリューション エクスプローラーで [Provision_Samples] > [custom_hsm_example] > [ソース ファイル] の順に移動し、custom_hsm_example.c を開きます。

  2. COMMON_NAME 文字列定数の文字列値を、デバイス証明書の生成時に使用した共通名 my-x509-device を使用して更新します。

    static const char* const COMMON_NAME = "my-x509-device";
    
  3. CERTIFICATE 定数文字列の文字列値を、前に生成した デバイス証明書 device-cert.pem を使用して、更新します。

    サンプルの証明書のテキストの構文は、次のパターンに従う必要があります。Visual Studio によって余分なスペースが追加されたり、解析が実行されたりしないようにしてください。

    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
    

    定数値の証明書の出力テキストをコピーして貼り付けます。

  4. PRIVATE_KEY 定数の文字列値を、デバイス証明書の暗号化されていない秘密キー (unencrypted-device-key.pem) で更新します。

    秘密キーのテキストの構文は、次のパターンに従う必要があります。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
    

    定数値の秘密キーの出力テキストをコピーして貼り付けます。

  5. 変更を保存します。

  6. custom_hsm_-_example プロジェクトを右クリックして [ビルド] を選択します。

    重要

    次のセクションでソリューションの残りの部分をビルドする前に、custom_hsm_example プロジェクトをビルドする必要があります。

サンプルを実行する

  1. 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 コマンド プロンプトを使用します。

  1. Azure portal で、Device Provisioning Service の [概要] タブを選択します。

  2. [ID スコープ] の値をコピーします。

    Screenshot of the ID scope on Azure portal.

  3. Windowsコマンド プロンプトで、X509Sample ディレクトリに変更します。 このディレクトリは、コンピューター上のサンプルを複製したディレクトリの外にある .\azure-iot-sdk-csharp\provisioning\device\samples\getting started\X509Sample ディレクトリにあります。

  4. 次のコマンドを入力して、x.509 デバイス プロビジョニング サンプルをビルドして実行します (<IDScope> の値は、前のセクションでコピーした ID スコープに置き換えます。 証明書ファイルは既定の ./certificate.pfx であり、.pfx のパスワードを入力するように求められます。

    dotnet run -- -s <IDScope>
    

    証明書とパスワードをパラメーターとして渡す場合は、次の形式を使用してください。

    Note

    アプリケーションの実行中に追加のパラメーターを渡して TransportType (-t) と GlobalDeviceEndpoint (-g) を変更できます。

    dotnet run -- -s 0ne00000A0A -c certificate.pfx -p 1234
    
  5. そのデバイスは 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 コマンド プロンプトを使用します。

  1. Azure portal で、Device Provisioning Service の [概要] タブを選択します。

  2. [ID スコープ] の値をコピーします。

    Screenshot of the ID scope on Azure portal.

  3. Windowsコマンド プロンプトで、サンプル ディレクトリに移動して、サンプルに必要なパッケージをインストールします。 表示されるパスは、SDK を複製した場所に相対しています。

    cd .\azure-iot-sdk-node\provisioning\device\samples
    npm install
    

    DPS を使用して IoT デバイスの認証とプロビジョニングを行うために、このサンプルでは 5 つの環境変数を使用しています。 それらの環境変数を次に示します。

    変数名 説明
    PROVISIONING_HOST DPS インスタンスへの接続に使用するエンドポイント。 このクイックスタートでは、グローバル エンドポイント global.azure-devices-provisioning.net を使用します。
    PROVISIONING_IDSCOPE DPS インスタンスの ID スコープ。
    PROVISIONING_REGISTRATION_ID デバイスの登録 ID。 デバイス証明書のサブジェクト共通名と一致する必要があります。
    CERTIFICATE_FILE デバイス証明書ファイルへのパス。
    KEY_FILE デバイスの秘密キー ファイルへのパス。
  4. グローバル デバイス エンドポイントと ID スコープの環境変数を追加します。 <id-scope> を、手順 2 でコピーした値に置き換えます。

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<id-scope>
    
  5. デバイス登録 ID のための環境変数を設定します。 IoT デバイスの登録 ID は、そのデバイス証明書上のサブジェクト共通名と一致している必要があります。 このクイックスタートの手順に従って自己署名テスト証明書を生成した場合は、my-x509-device がサブジェクト名と、デバイスの登録 ID の両方となります。

    set PROVISIONING_REGISTRATION_ID=my-x509-device
    
  6. デバイス証明書と (暗号化されていない) デバイス秘密キー ファイルの環境変数を設定します。

    set CERTIFICATE_FILE=.\device-cert.pem
    set KEY_FILE=.\unencrypted-device-key.pem
    
  7. サンプルを実行して、デバイスが正常にプロビジョニングされたことを検証します。

    node register_x509.js
    

    次の例のような出力が表示されます。

    registration succeeded
    assigned hub=contoso-hub-2.azure-devices.net
    deviceId=my-x509-device
    Client connected
    send status: MessageEnqueued
    

このセクションでは、Windows コマンド プロンプトを使用します。

  1. Azure portal で、Device Provisioning Service の [概要] タブを選択します。

  2. [ID スコープ][グローバル デバイス エンドポイント] の値をコピーします。

    Screenshot of the ID scope and global device endpoint on Azure portal.

  3. Windowsコマンド プロンプトで、provision_x509.py サンプルのディレクトリに移動します。 表示されるパスは、SDK を複製した場所に相対しています。

    cd ./azure-iot-sdk-python/samples/async-hub-scenarios
    

    DPS を使用して IoT デバイスの認証とプロビジョニングを行うために、このサンプルでは 6 つの環境変数を使用しています。 それらの環境変数を次に示します。

    変数名 説明
    PROVISIONING_HOST DPS インスタンスへの接続に使用されるグローバル エンドポイント。
    PROVISIONING_IDSCOPE DPS インスタンスの ID スコープ。
    DPS_X509_REGISTRATION_ID デバイスの登録 ID。 デバイス証明書上のサブジェクト名とも一致している必要があります。
    X509_CERT_FILE デバイス証明書ファイルへのパス。
    X509_KEY_FILE デバイス証明書の秘密キー ファイルへのパス。
    PASS_PHRASE 証明書と秘密キー ファイルを暗号化する際に使用したパス フレーズ (1234)。
  4. グローバル デバイス エンドポイントと ID スコープの環境変数を追加します。

    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    set PROVISIONING_IDSCOPE=<ID scope for your DPS resource>
    
  5. 登録 ID の環境変数を設定します。 IoT デバイスの登録 ID は、そのデバイス証明書上のサブジェクト名と一致している必要があります。 このクイックスタートの手順に従って自己署名テスト証明書を生成した場合は、my-x509-device がサブジェクト名と、デバイスの登録 ID の両方となります。

    set DPS_X509_REGISTRATION_ID=my-x509-device
    
  6. 証明書ファイル、秘密キー ファイル、パス フレーズの環境変数を設定します。

    set X509_CERT_FILE=./device-cert.pem
    set X509_KEY_FILE=./device-key.pem
    set PASS_PHRASE=1234
    
  7. provision_x509.py のコードを確認します。 Python バージョン 3.7 以降を使用していない場合は、こちらに記載されているコード変更を行って asyncio.run(main()) を置き換えて、変更を保存してください。

  8. サンプルを実行します。 サンプルは、IoT ハブにデバイスをプロビジョニングする DPS に接続します。 デバイスがプロビジョニングされると、サンプルはいくつかのテスト メッセージを 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
    null
    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 コマンド プロンプトと Git Bash プロンプトの両方を使用します。

  1. Azure portal で、Device Provisioning Service の [概要] タブを選択します。

  2. [ID スコープ][グローバル デバイス エンドポイント] の値をコピーします。

    Screenshot of the ID scope and global device endpoint on Azure portal.

  3. Windows コマンド プロンプトで、サンプル プロジェクト フォルダーに移動します。 表示されるパスは、SDK を複製した場所に相対しています。

    cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
    
  4. プロビジョニング サービスと X.509 の ID 情報をサンプル コードに入力します。 この情報はプロビジョニング中、デバイス登録の前に、シミュレートされたデバイスの構成証明に使用されます。

    1. 使い慣れたエディターでファイル .\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java を開きます

    2. 次の値を、前にコピーした 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;
      
      
    3. leafPublicPem 定数文字列の値を、証明書の値 device-cert.pem で更新します。

      証明書のテキストの構文は、次のパターンに従う必要があります。余分なスペースや文字が追加されないようにしてください。

      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
      

      定数値の証明書の出力テキストをコピーして貼り付けます。

    4. leafPrivateKey 定数の文字列値を、デバイス証明書の暗号化されていない秘密キー (unencrypted-device-key.pem) で更新します。

      秘密キーのテキストの構文は、次のパターンに従う必要があります。余分なスペースや文字が追加されないようにしてください。

      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
      

      定数値の秘密キーの出力テキストをコピーして貼り付けます。

    5. 変更を保存します。

  5. サンプルをビルドしてから、target フォルダーへ移動します。

    mvn clean install
    cd target
    
  6. ビルドは .jar ファイルを target フォルダーに、ファイル形式 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
    

    サンプルは、IoT ハブにデバイスをプロビジョニングする DPS に接続します。 デバイスがプロビジョニングされると、サンプルはいくつかのテスト メッセージを 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!
    

デバイス プロビジョニングの登録を確認する

デバイスがプロビジョニングされた IoT ハブを確認するには、前に作成した個別の登録の登録詳細を確認します。

  1. Azure portal で、Device Provisioning Service に移動します。

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

  3. [個別の登録] を選択します。 以前に作成した X.509 登録エントリ my-x509-device が一覧に表示されます。

  4. その登録エントリを選択します。 デバイスが割り当てられた IoT ハブとそのデバイス ID が [登録状態] に表示されます。

IoT ハブでデバイスを確認するには:

  1. Azure portalで、デバイスが割り当てられた IoT ハブに移動します。

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

  3. デバイスが正常にプロビジョニングされた場合は、そのデバイス ID my-x509-device が一覧に表示され、[状態][有効] と設定されているはずです。 デバイスが表示されない場合は、[最新の情報に更新] を選択します。

    Screenshot that shows the device is registered with the IoT hub in Azure portal.

重要

[Initial device twin state](初期のデバイス ツインの状態) をデバイスの登録エントリの既定値から変更した場合、デバイスはハブから目的のツインの状態をプルし、それに従って動作することができます。 詳細については、「IoT Hub のデバイス ツインの理解と使用」を参照してください。

リソースをクリーンアップする

デバイス クライアント サンプルでの作業と確認を続行する予定の場合は、このクイックスタートで作成したリソースをクリーンアップしないでください。 続行する予定がない場合は、次の手順を使用して、このクイックスタートで作成したすべてのリソースを削除してください。

デバイスの登録を削除する

  1. マシンに表示されているデバイス クライアント サンプルの出力ウィンドウを閉じます。

  2. Azure portal の左側のメニューから、 [すべてのリソース] を選択します。

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

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

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

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

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

IoT Hub からデバイスの登録を削除する

  1. Azure portal の左側のメニューから、 [すべてのリソース] を選択します。

  2. IoT ハブを選択します。

  3. [エクスプローラー] メニューで、 [IoT デバイス] を選択します。

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

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

次のステップ

このクイック スタートでは、個別登録を使用して 1 つのデバイスを IoT ハブにプロビジョニングしました。 次に、複数のハブ間で複数のデバイスをプロビジョニングする方法について説明します。