次の方法で共有


チュートリアル: Azure IoT Edge用にセキュリティで保護されたトランスポート サーバー経由の登録を構成する

対象:IoT Edge 1.5 チェックマーク IoT Edge 1.5

重要

IoT Edge 1.5 LTS は、サポートされているリリースです。 IoT Edge 1.4 LTS は 2024 年 11 月 12 日に終了しました。 以前のリリースを使用している場合は、「Update IoT Edgeを参照してください。

Azure IoT Edgeを使用すると、セキュリティで保護されたトランスポート (EST) サーバー経由の登録を使用して x509 証明書を管理するようにデバイスを構成できます。

このチュートリアルでは、テスト EST サーバーをホストし、デバイス ID x509 証明書の登録と更新のために IoT Edge デバイスを構成する手順について説明します。 このチュートリアルでは、以下の内容を学習します。

  • デバイス ID 証明書のテスト EST サーバーを作成してホストする
  • DPS グループの登録を構成する
  • デバイスの構成

前提条件

開始する前に、以下の前提条件を確認してください。

運用環境に推奨されるデバイス ID 証明書の自動発行と更新に EST とIoT Edgeを使用するには、IoT Edgeは、DPS CA ベースの登録グループの一部としてプロビジョニングする必要があります。 IoT Hubを使用した手動 X.509 プロビジョニングや、個々の登録を使用した DPS など、その他のプロビジョニング方法では、デバイス ID 証明書の自動更新はサポートされません。

セキュア・トランスポートを介した登録とは何か

EST (Enrollment over Secure Transport) は、X.509 証明書の発行を自動化する暗号プロトコルです。 これは、証明機関 (CA) に関連付けられているクライアント証明書を必要とするIoT Edge インスタンスなど、公開キー 基盤 (PKI) クライアントに使用されます。 EST は、リスクが大きく間違いが発生しやすい手作業での証明書管理に代わるものです。

EST サーバー

証明書の発行と更新には、デバイスが EST サーバーにアクセスする必要があります。

重要

運用環境では、GlobalSign IoT Edge Enroll または DigiCert IoT Device Manager を使用します。

GlobalSign の EST サービスの使用の詳細については、「 GlobalSign EST を使用した自動IoT Edge証明書の管理を参照してください。

テストと開発には、テスト EST サーバーを使用できます。 このチュートリアルでは、テスト EST サーバーを作成します。

デバイスで EST サーバーを実行する

このチュートリアルでは、簡単な EST サーバーを IoT Edge デバイス上のコンテナーにローカルにデプロイする手順を簡単に説明します。 この方法は、それを試す最も簡単なアプローチです。

Dockerfile では、libestと呼ばれる Cisco ライブラリである Ubuntu 18.04 とサンプル サーバー コードを使用します。 これは、変更できる次の設定で構成されます。

  • 20 年間有効なルート CA
  • 10 年間有効な EST サーバー証明書
  • EST 更新をテストするために、証明書の既定の日数は 1 に設定
  • EST サーバーは、コンテナー内の IoT Edge デバイスでローカルに実行されます

注意事項

運用環境ではこの Dockerfile を使用しないでください。

  1. IOT EDGEをインストールした SSH などを使用してデバイスに接続します。

  2. Dockerfile (大文字と小文字を区別する) という名前のファイルを作成し、お気に入りのテキスト エディターを使用してサンプル コンテンツを追加します。

    ヒント

    Azure Container Instance で EST サーバーをホストする場合は、myestserver.westus.azurecontainer.io を EST サーバーの DNS 名に変更します。 DNS 名を選択するときは、Azure Container インスタンスの DNS ラベルの長さが 5 文字以上である必要があることに注意してください。

    # DO NOT USE IN PRODUCTION - Use only for testing 
    
    FROM ubuntu:18.04
    
    RUN apt update && apt install -y apache2-utils git openssl libssl-dev build-essential && \
        git clone https://github.com/cisco/libest.git && cd libest && \
        ./configure --disable-safec && make install && \
        rm -rf /src && apt remove --quiet -y libssl-dev build-essential && \
        apt autoremove -y && apt clean -y && apt autoclean -y && \
        rm -rf /var/lib/apt /tmp/* /var/tmp/*
    
    WORKDIR /libest/example/server/
    
    # Setting the root CA expiration to 20 years
    RUN sed -i "s|-days 365|-days 7300 |g" ./createCA.sh
    
    ## If you want to use the EST server to issue Edge CA certificates, 
    ## uncomment the RUN sed section after this comment block. 
    ## The sed commands add special extensions for Edge CA certificates. For more information see: 
    ## https://learn.microsoft.com/azure/iot-edge/how-to-manage-device-certificates?tabs=windows#edge-ca-in-production
    ##
    ## IMPORTANT:
    ##   DO NOT issue Edge CA certificates in production.
    ##   For production, use digital certificates from a trusted CA.
    ##   See https://techcommunity.microsoft.com/blog/iotblog/automatic-iot-edge-certificate-management-with-globalsign-est/4384385
    ##
    ##   Using EST for Edge CA is for demonstration and learning purposes only.
    ##
    # RUN sed -i "s|basicConstraints=CA:FALSE|basicConstraints=critical,CA:TRUE,pathlen:0|g" ./estExampleCA.cnf && \
    #     sed -i "s|keyUsage=digitalSignature|keyUsage=critical,digitalSignature,keyCertSign|g" ./estExampleCA.cnf && \
    #     sed -i "s|authorityKeyIdentifier=keyid|authorityKeyIdentifier=keyid:always|g" ./estExampleCA.cnf
    
    ## If you want to host your EST server remotely (for example, an Azure Container Instance),
    ## change myestserver.westus.azurecontainer.io to the fully qualified DNS name of your EST server
    ## OR, change the IP address
    ## and uncomment the corresponding lines.
    # RUN sed -i "s|DNS.2 = ip6-localhost|DNS.2 = myestserver.westus.azurecontainer.io|g" ./ext.cnf
    # RUN sed -i "s|IP.2 = ::1|IP.2 = <YOUR EST SERVER IP ADDRESS>|g" ./ext.cnf
    
    # Set EST server certificate to be valid for 10 years
    RUN sed -i "s|-keyout \$EST_SERVER_PRIVKEY -subj|-keyout \$EST_SERVER_PRIVKEY -days 7300 -subj |g" ./createCA.sh
    
    # Create the CA
    RUN echo 1 | ./createCA.sh
    
    # Set cert default-days to 1 to show EST renewal
    RUN sed -i "s|default_days   = 365|default_days   = 1 |g" ./estExampleCA.cnf
    
    # The EST server listens on port 8085 by default
    # Uncomment to change the port to 443 or something else. If changed, EXPOSE that port instead of 8085. 
    # RUN sed -i "s|estserver -c|estserver -p 443 -c |g" ./runserver.sh
    EXPOSE 8085
    CMD ./runserver.sh
    
  3. Dockerfileを含むディレクトリで、サンプル Dockerfile からイメージをビルドします。

    sudo docker build . --tag est
    
  4. コンテナーを起動し、ホスト上のポート 8085 にコンテナーのポート 8085 を公開します。

    sudo docker run -d -p 8085:8085 est
    
  5. これで、EST サーバーが実行され、ポート 8085 の localhost を使用して到達できるようになりました。 コマンドを実行してそのサーバー証明書を表示し、利用可能であることを確認してください。

    openssl s_client -showcerts -connect localhost:8085
    
  6. 出力の途中 に-----BEGIN CERTIFICATE----- が表示されます。 サーバーが到達可能であり、その証明書を提示できることが、証明書を取得することによって確認されます。

ヒント

このコンテナーをクラウドで実行するには、イメージをビルドし、イメージをAzure Container Registryにpushします。 次に、quickstart に従って、Azure Container Instance にデプロイします。

CA 証明書をダウンロードする

各デバイスには、デバイス ID 証明書に関連付けられている証明機関 (CA) 証明書が必要です。

  1. IoT Edge デバイスで、/var/aziot/certs ディレクトリが存在しない場合は作成し、ディレクトリをそれに変更します。

    # If the certificate directory doesn't exist, create, set ownership, and set permissions
    sudo mkdir -p /var/aziot/certs
    sudo chown aziotcs:aziotcs /var/aziot/certs
    sudo chmod 755 /var/aziot/certs
    
    # Change directory to /var/aziot/certs
    cd /var/aziot/certs
    
  2. EST サーバーから /var/aziot/certs ディレクトリに CA 証明書を取得し、 cacert.crt.pem名前を付けます。

    openssl s_client -showcerts -verify 5 -connect localhost:8085 < /dev/null | sudo awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}' && sudo cp cert2.pem cacert.crt.pem
    
  3. キー サービス ユーザー aziotcs が証明書を所有している必要があります。 すべての証明書ファイルの所有権を aziotcs に設定し、アクセス許可を設定します。 証明書の所有権とアクセス許可の詳細については、「 アクセス許可の要件」を参照してください。

    # Give aziotcs ownership to certificates
    sudo chown -R aziotcs:aziotcs /var/aziot/certs
    # Read and write for aziotcs, read-only for others
    sudo find /var/aziot/certs -type f -name "*.*" -exec chmod 644 {} \;
    

DPSを使用してIoT Edgeデバイスをプロビジョニングする。

Device Provisioning Service を使用すると、IoT Edgeの EST サーバーから証明書を自動的に発行および更新できます。 チュートリアル EST サーバーを使用すると、ID 証明書の有効期限が 1 日で切れます。証明書の有効期限が切れるたびに、IoT Hubで拇印を手動で更新する必要があるため、IoT Hubを使用した手動プロビジョニングは実用的ではありません。 登録グループを使用した DPS CA 認証を使用すると、手動の手順なしでデバイス ID 証明書を更新できます。

CA 証明書を DPS にアップロードする

  1. IoT Hubにリンクされた Device Provisioning Service がない場合は、「Quickstart: Azure ポータルで IoT Hub Device Provisioning Service を設定するを参照してください。

  2. cacert.crt.pem ファイルを、開発用コンピューターなどのAzure ポータルにアクセスできるコンピューターにデバイスから転送します。 証明書を転送する簡単な方法は、デバイスにリモート接続し、コマンド cat /var/aziot/certs/cacert.crt.pemを使用して証明書を表示し、出力全体をコピーして、開発用コンピューター上の新しいファイルに内容を貼り付ける方法です。

  3. Azure ポータルで、IoT Hub Device Provisioning Service のインスタンスに移動します。

  4. [ 設定] で [ 証明書] を選択し、[ +追加] を選択します。

    Azure ポータルを使用して Device Provisioning Service に CA 証明書を追加する画面のスクリーンショット。

    設定
    証明書名 CA 証明書のフレンドリ名を入力します。
    証明書の .pem または .cer ファイル EST サーバーから cacert.crt.pem を参照します。
    アップロード時に証明書の状態を確認済みに設定する チェックボックスをオンにします。
  5. 保存を選びます。

登録グループを作成する

  1. Azure ポータルで、IoT Hub Device Provisioning Service のインスタンスに移動します。

  2. [設定] の下の [登録の管理] を選択します。

  3. [ 登録グループの追加] を選択し、次の手順を実行して登録を構成します。

  4. [ 登録とプロビジョニング ] タブで、次の設定を選択します。

    Azure portal を使用して DPS 登録グループを追加する方法を示すスクリーンショット

    設定
    証明メカニズム この Device Provisioning Service インスタンスにアップロードされた X.509 証明書を選択します
    プライマリ証明書 ドロップダウン リストから証明書を選択します。
    グループ名 このグループ登録のフレンドリ名を指定します。
    プロビジョニングステータス [ この登録を有効にする] チェック ボックスをオンにします。
  5. [ IoT Hubs ] タブで、一覧から IoT ハブを選択します。

  6. [デバイスの設定] タブで、[プロビジョニングされたデバイスでIoT Edgeを有効にする] チェック ボックスをオンにします。 その他の設定は、このチュートリアルには関係ありません。 既定の設定をそのまま使用できます。

  7. [Review + create](レビュー + 作成) を選択します。

デバイスの登録が存在するので、IoT Edge ランタイムは、リンクされた IoT ハブのデバイス証明書を自動的に管理できます。

IoT Edgeデバイスを構成する

IoT Edge デバイスで、EST サーバーのデバイス証明書を使用するようにIoT Edge構成ファイルを更新します。

  1. エディターを使用してIoT Edge構成ファイルを開きます。 たとえば、 nano エディターを使用して /etc/aziot/config.toml ファイルを 開きます。

    sudo nano /etc/aziot/config.toml
    
  2. 構成ファイルの以下のセクションを追加または置き換えます。 これらの構成設定では、最初にユーザー名とパスワード認証を使用して、EST サーバーからデバイス証明書を取得します。 デバイス証明書は、将来の証明書の更新のために EST サーバーに対して認証されます。

    <DPS-ID-SCOPE> は、登録済みデバイスを含む IoT ハブにリンクされている DPS の ID Scope に置き換え、myiotedgedevice を Azure IoT Hub に登録されたデバイス ID に置き換えます。 [DPSの概要] ページで ID スコープの値を確認できます。

    # DPS provisioning with X.509 certificate
    # Replace with ID Scope from your DPS
    [provisioning]
    source = "dps"
    global_endpoint = "https://global.azure-devices-provisioning.net"
    id_scope = "<DPS-ID-SCOPE>"
    
    [provisioning.attestation]
    method = "x509"
    registration_id = "myiotedgedevice"
    
    [provisioning.attestation.identity_cert]
    method = "est"
    common_name = "myiotedgedevice"
    
    # Auto renewal settings for the identity cert
    # Available only from IoT Edge 1.3 and above
    [provisioning.attestation.identity_cert.auto_renew]
    rotate_key = false
    threshold = "80%"
    retry = "4%"
    
    # Trusted root CA certificate in the global EST options
    # Optional if the EST server's TLS certificate is already trusted by the system's CA certificates.
    [cert_issuance.est]
        trusted_certs = [
            "file:///var/aziot/certs/cacert.crt.pem",
        ]
    
    # The default username and password for libest
    # Used for initial authentication to EST server
    #
    # Not recommended for production
    [cert_issuance.est.auth]
    username = "estuser"
    password = "estpwd"
    
    [cert_issuance.est.urls]
    default = "https://localhost:8085/.well-known/est"
    

    この例では、IoT Edgeは、証明書を取得する必要があるたびに、ユーザー名とパスワードを使用して EST サーバーに対する認証を行います。 このメソッドは、シークレットをプレーンテキストで格納する必要があるため、運用環境では推奨されません。 また、IoT Edgeは ID 証明書を使用して EST サーバーに対する認証を行う必要があります。 運用環境用に変更するには:

    1. DPS の推奨される方法と同様に、製造時にデバイスに保存する有効期間の長いブートストラップ証明書を使用することを検討してください。 EST サーバーのブートストラップ証明書を構成する方法については、「EST を介して動的に発行された証明書を使用してデバイスを認証するを参照してください。
    2. 前の例に示したプロビジョニング証明書の自動更新構成として、[cert_issuance.est.identity_auto_renew] を使用して、を構成します。

    これにより、IoT Edge証明書サービスは、EST サーバーでの初期認証にブートストラップ証明書を使用し、同じサーバーに対する将来の EST 要求に対して ID 証明書を要求します。 何らかの理由で、更新前に EST ID 証明書の有効期限が切れた場合、IoT Edgeブートストラップ証明書の使用にフォールバックします。

  3. sudo iotedge config applyを実行して新しい設定を適用します。

  4. sudo iotedge check を実行して、IoT Edgeデバイスの構成を確認します。 すべての構成チェックは成功するはずです。 このチュートリアルでは、運用環境の準備状況のエラーと警告、DNS サーバーの警告、接続チェックは無視してかまいません。

  5. IoT Hubのデバイスにアクセスします。 証明書の拇印は、DPS と EST サーバーを使用してデバイスに自動的に追加されます。

    Azure ポータルのIoT Hubデバイス設定のスクリーンショット。証明書の拇印フィールドに値が表示されます。

    新しいIoT Edge デバイスを作成すると、状態コード 417 -- The device's deployment configuration isn't set in the Azure portal. この状態は正常であり、デバイスがモジュールのデプロイを受け取る準備ができていることを意味します。

証明書の更新をテストする

デバイスから既存の証明書とキーを削除し、IoT Edge構成を適用することで、デバイス ID 証明書をすぐに再発行できます。 IoT Edgeは、不足しているファイルを検出し、新しい証明書を要求します。

  1. IoT Edge デバイスで、IoT Edge ランタイムを停止します。

    sudo iotedge system stop
    
  2. 既存の証明書とキーを削除します。

    sudo sh -c "rm /var/lib/aziot/certd/certs/*"
    sudo sh -c "rm /var/lib/aziot/keyd/keys/*"
    
  3. IoT Edge構成を適用して証明書を更新します。

    sudo iotedge config apply
    

    ランタイムが起動するまで数分待つ必要がある場合があります。

  4. IoT Hub内のデバイスにアクセスしてください。 証明書の拇印が更新されます。

     Azure ポータルのIoT Hubデバイス設定のスクリーンショット。証明書の拇印フィールドには、新しい値が表示されます。

  5. コマンド sudo ls -l /var/lib/aziot/certd/certsを使用して証明書ファイルを一覧表示します。 デバイス証明書ファイルの直近の作成日が表示されます。

  6. openssl コマンドを使用して、新しい証明書の内容を確認します。 次に例を示します。

    sudo openssl x509 -in /var/lib/aziot/certd/certs/deviceid-bd732105ef89cf8edd2606a5309c8a26b7b5599a4e124a0fe6199b6b2f60e655.cer -text -noout
    

    デバイス証明書のファイル名 (.cer) を実際のデバイスの証明書ファイルに置き換えます。

    証明書の 有効期間 の日付範囲が変更されていることがわかります。

次の省略可能なテストでは、IoT Edgeが期限切れになったり、存在しない場合に EST サーバーから証明書を更新する方法を示します。 各テストの後、Azure ポータルで新しい拇印を確認し、openssl コマンドを使用して新しい証明書を確認できます。

  1. 証明書の有効期限が切れるまで 1 日待ちます。 テスト EST サーバーによって作成された証明書は、1 日後に有効期限が切れるように構成されています。 IoT Edge証明書が自動的に更新されます。
  2. threshold で設定された自動更新のの割合を調整します (現在、構成例では 80% に設定されています)。 たとえば、 10% に設定し、証明書の更新を約 2 時間ごとに確認します。
  3. thresholdを整数に調整し、その後にm (分) を続けます。 たとえば、 60m に設定し、有効期限の 1 時間前に証明書の更新を確認します。

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

このチュートリアルで作成したリソースと構成は、そのまま残して再利用できます。 それ以外の場合は、課金を回避するために、この記事で使用したローカル構成とAzure リソースを削除します。

Azure リソースを削除する

Azureリソースとリソース グループの削除を元に戻すことはできません。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。 保持するリソースがある既存のリソース グループ内にIoT Hubを作成した場合は、リソース グループではなく、IoT Hub リソース自体のみを削除します。

リソースを削除するには、次の手順に従います。

  1. Azure ポータルにサインインし、Resource グループ を選択します。
  2. IoT Edgeテスト リソースを含むリソース グループの名前を選択します。
  3. リソース グループに含まれているリソースの一覧を確認します。 それらすべてを削除する場合は、[ リソース グループの削除] を選択できます。 一部のみを削除する場合は、各リソースを選択して個別に削除します。

次のステップ

  • EST サーバーを使用してエッジ CA 証明書を発行するには、サンプル構成を参照してください。
  • ユーザー名とパスワードを使用して EST サーバーへの認証をブートストラップすることは、運用環境では推奨されません。 代わりに、DPS の推奨される方法と同様に、製造時にデバイスに格納できる有効期間の長いブートストラップ証明書を使用することを検討してください。 EST サーバーのブートストラップ証明書を構成する方法については、「EST を介して動的に発行された証明書を使用してデバイスを認証するを参照してください。
  • EST サーバーを使用して、階層内のすべてのデバイスの証明書を発行することもできます。 ISA-95 の要件があるかどうかに応じて、EST サーバーのチェーンをすべてのレイヤーで実行するか、API プロキシ モジュールを使用して要求を転送することが必要になる場合があります。 詳細については、 Kevin のブログを参照してください。
  • エンタープライズ グレードのソリューションの場合は、GlobalSign IoT Edge EnrollDigiCert IoT Device Manager、および Keytos EZCA を検討してください。
  • 証明書の詳細については、「Azure IoT Edgeで証明書を使用する方法を理解するを参照してください。