チュートリアル: Azure IoT Edge 用に Enrollment over Secure Transport サーバーを構成する

適用対象:IoT Edge 1.4 チェックマーク IoT Edge 1.4

重要

IoT Edge 1.4 がサポートされているリリースです。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。

Azure IoT Edge では、EST (Enrollment over Secure Transport) サーバーを使用して x509 証明書を管理するようにデバイスを構成できます。

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

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

このチュートリアルに取り組むために必要な 3 つのステップの概要を示す図。

前提条件

Enrollment over Secure Transport とは

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

EST サーバー

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

重要

エンタープライズ グレードのソリューションの場合は、GlobalSign IoT Edge Enroll または DigiCert IoT Device Manager を検討してください。

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

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

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

この Dockerfile には、Ubuntu 18.04、Cisco ライブラリ (libest)サンプル サーバー コードが使用されています。 次の設定を使用して構成されていますが、これらの設定は変更できます。

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

注意事項

この Dockerfile を運用環境で使用することは避けてください。

  1. IoT Edge がインストールされているデバイスに、SSH を使用するなどして接続します。

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

    ヒント

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

    # 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 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 line.
    # 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 サーバーが実行状態になりました。localhost を使用してポート 8085 で到達できます。 コマンドを実行してそのサーバー証明書を表示し、利用可能であることを確認してください。

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

ヒント

このコンテナーをクラウドで実行するには、イメージをビルドして Azure Container Registry にプッシュします。 その後、Azure Container Instances へのデプロイに関するクイックスタートに従ってください。

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

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

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

    # If the certificate directory doen'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. Device Provisioning Service を IoT Hub にリンクさせていない場合は、「クイックスタート:Azure Portal で IoT Hub Device Provisioning Service を設定する」を参照してください。

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

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

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

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

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

登録グループを作成する

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

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

  3. [登録グループの追加] を選択し、登録を構成する以下の手順を完了します。

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

    Azure portal を使用して DPS 登録グループを追加する画面のスクリーンショット。

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

  6. [Device settings] (デバイス設定) タブで、[プロビジョニングされたデバイスで IoT Edge を有効にする] チェック ボックスをオンにします。

    その他の設定は、このチュートリアルには関係ありません。 既定の設定をそのまま使用できます。

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

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

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 Hub にリンクされた DPS の ID スコープに、myiotedgedevice は、Azure IoT Hub に登録されたデバイス ID に置き換えてください。 ID スコープの値は、DPS の [概要] ページで確認できます。

    # 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"
    

    Note

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

    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 portal の IoT Hub デバイス設定のスクリーンショット。証明書の拇印フィールドに値が表示されています。

    注意

    新しい IoT Edge デバイスを作成すると、状態コード 417 -- The device's deployment configuration is not set in the Azure portal. が表示されますが、この状態は正常です。デバイスにモジュールをデプロイする準備が整っていることを意味します。

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

デバイス ID 証明書は、既存の証明書とキーをデバイスから削除し、IoT Edge の構成を適用することですぐに再発行できます。 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 portal の 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) を実際のデバイスの証明書ファイルに置き換えます。

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

証明書の更新は、必要に応じて以下の方法でもテストできます。 これらのチェックは、EST サーバーからの証明書が期限切れになった場合や見つからない場合に、それらが IoT Edge でどのように更新されるかをデモンストレーションするものです。 各テストの後、Azure portal で新しい拇印を確認し、openssl コマンドを使用して新しい証明書を確認できます。

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

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

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

Azure リソースを削除する

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

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

  1. Azure portal にサインインし、 [リソース グループ] を選択します。

  2. IoT Edge のテスト リソースを含んだリソース グループの名前を選択します。

  3. リソース グループに含まれているリソースの一覧を確認します。 それらすべてを削除する場合は、 [リソース グループの削除] を選択します。 一部だけを削除する場合は、削除する各リソースをクリックして個別に削除してください。

次のステップ

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