分享方式:


教學課程:為 Azure IoT Edge 設定透過安全傳輸的註冊伺服器

適用於: IoT Edge 1.5 核取記號 IoT Edge 1.5 IoT Edge 1.4 核取記號 IoT Edge 1.4

重要

IoT Edge 1.5 LTS 和 IoT Edge 1.4 LTS 為支援的版本。 IoT Edge 1.4 LTS 於 2024 年 11 月 12 日結束生命週期。 如果您是舊版,請參閱更新 IoT Edge

使用 Azure IoT Edge 時,您可以將裝置設定為使用透過安全傳輸的註冊 (EST) 伺服器來管理 X.509 憑證。

本教學課程會逐步引導您裝載測試 EST 伺服器,以及設定 IoT Edge 裝置,以註冊和更新 x509 憑證。 在本教學課程中,您會了解如何:

  • 建立及裝載測試 EST 伺服器
  • 設定 DPS 群組註冊
  • 設定裝置

圖表:顯示完成本教學課程所需的三個步驟高階概觀。

必要條件

什麼是透過安全傳輸的註冊?

透過安全傳輸的註冊 (EST) 是一種密碼編譯通訊協定,可自動發行 X.509 憑證。 其可用於公開金鑰基礎結構 (PKI) 用戶端,例如需要與憑證授權單位 (CA) 相關聯之用戶端憑證的 IoT Edge。 EST 可取代可能有風險且容易出錯的手動管理憑證需求。

EST 伺服器

若要發行和更新憑證,您需要可供裝置存取的 EST 伺服器。

重要

如需企業級解決方案,請考慮:GlobalSign IoT Edge Enroll (英文) 或 DigiCert IoT Device Manager (英文)。

若要進行測試和開發,您可以使用測試 EST 伺服器。 在本教學課程中,我們會建立測試 EST 伺服器。

在裝置上執行 EST 伺服器

為了快速開始使用,本教學課程會示範在 IoT Edge 裝置本機的容器中部署簡單 EST 伺服器的步驟。 此方法是最簡單的試用方法。

Dockerfile 會使用 Ubuntu 18.04、名為 libest 的 Cisco 程式庫 (英文),以及範例伺服器程式碼 (英文)。 其會使用下列可加以變更的設定來進行進定:

  • 有效期為 20 年的根 CA
  • 有效期為 10 年的 EST 伺服器憑證
  • 將憑證預設天數設定為 1 以測試 EST 更新
  • EST 伺服器會在容器中的 IoT Edge 裝置本機上執行

警告

請勿在生產環境中使用此 Dockerfile。

  1. 連線到已安裝 IoT Edge 的裝置 (例如使用 SSH)。

  2. 建立名為 Dockerfile 的檔案 (區分大小寫),並使用慣用的文字編輯器新增範例內容。

    提示

    如果您想要在 Azure 容器執行個體中裝載 EST 伺服器,請將 myestserver.westus.azurecontainer.io 變更為 EST 伺服器的 DNS 名稱。 在選擇 DNS 名稱時,請注意 Azure 容器執行個體的 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 伺服器正在執行,而且可以在連接埠 8085 上使用 localhost 來與其連線。 確認 EST 伺服器可供使用,方法是執行命令來查看其伺服器憑證。

    openssl s_client -showcerts -connect localhost:8085
    
  6. 您應該會在輸出的中間位置看到 -----BEGIN CERTIFICATE-----。 擷取憑證會驗證伺服器是否可供連線,而且可以呈現其憑證。

提示

若要在雲端中執行此容器,請建置映像,並將映像推送至 Azure Container Registry。 然後,遵循用來部署至 Azure 容器執行個體的快速入門

下載 CA 憑證

每個裝置都需要與裝置身分識別憑證相關聯的憑證授權單位 (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 伺服器擷取 CA 憑證到 /var/aziot/certs 目錄,並將其命名為 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 裝置

使用裝置佈建服務可讓您從 IoT Edge 中的 EST 伺服器自動發行和更新憑證。 在使用教學課程的 EST 伺服器時,身分識別憑證會在一天內到期,由於每次憑證到期就必須在 IoT 中樞手動更新指紋,因此以手動方式佈建 IoT 中樞是不切實際的。 使用註冊群組的 DPS CA 驗證可讓裝置的身分識別憑證進行更新,而不需要任何手動步驟。

將 CA 憑證上傳至 DPS

  1. 如果您沒有連結至 IoT 中樞的裝置佈建服務,請參閱快速入門:使用 Azure 入口網站設定 IoT 中樞裝置佈建服務

  2. cacert.crt.pem 檔案從裝置傳輸到可存取 Azure 入口網站的電腦,例如您的開發電腦。 傳輸憑證的簡單方式是遠端連線到裝置、使用命令 cat /var/aziot/certs/cacert.crt.pem 顯示憑證、複製整個輸出,然後將內容貼到開發電腦上的新檔案。

  3. Azure 入口網站中,導覽至 IoT 中樞裝置佈建服務的執行個體。

  4. 在 [設定] 底下,依序選取 [憑證] 和 [+新增]

    螢幕擷取畫面:使用 Azure 入口網站將 CA 憑證新增至裝置佈建服務。

    設定
    憑證名稱 為 CA 憑證提供自訂名稱
    .pem 或 .cer 憑證檔案 從 EST 伺服器瀏覽至 cacert.crt.pem
    在上傳時將憑證狀態設定為已驗證​ 選取核取方塊
  5. 選取 [儲存]。

建立註冊群組

  1. Azure 入口網站中,導覽至 IoT 中樞裝置佈建服務的執行個體。

  2. 在 [設定] 下方,選取 [管理註冊]

  3. 選取 [新增註冊群組],然後完成下列步驟以設定註冊。

  4. 在 [註冊 + 佈建] 索引標籤上,選擇下列設定:

    螢幕擷取畫面:使用 Azure 入口網站新增 DPS 註冊群組。

    設定
    證明機制 選取 [上傳至此裝置佈建服務執行個體的 X.509 憑證]
    主要憑證 從挑選清單中選擇您的憑證
    群組名稱 為這個群組註冊提供自訂名稱
    佈建狀態 選取 [啟用此註冊] 核取方塊
  5. 在 [IoT 中樞] 索引標籤上,從清單中選擇您的 IoT 中樞。

  6. 在 [裝置設定] 索引標籤上,選取 [在已佈建的裝置上啟用 IoT Edge] 核取方塊。

    其他設定與本教學課程無關。 您可以接受預設設定。

  7. 選取 [檢閱 + 建立]。

現在裝置已有註冊了,因此 IoT Edge 執行階段可以自動管理所連結 IoT 中樞的裝置憑證。

設定 IoT Edge 裝置

在 IoT Edge 裝置上,更新 IoT Edge 組態檔,以使用來自 EST 伺服器的裝置憑證。

  1. 使用編輯器開啟 IoT Edge 組態檔。 例如,使用 nano 編輯器開啟 /etc/aziot/config.toml 檔案。

    sudo nano /etc/aziot/config.toml
    
  2. 在組態檔中新增或取代下列區段。 這些組態設定一開始會使用「使用者名稱和密碼」驗證,從 EST 伺服器取得裝置憑證。 裝置憑證可用來向 EST 伺服器進行驗證,以便日後更新憑證。

    將預留位置文字 <DPS-ID-SCOPE> 取代為與已註冊裝置所在 IoT 中樞連結之 DPS 的「識別碼範圍」,並將 myiotedgedevice 取代為已在 Azure IoT 中樞內註冊的裝置識別碼。 您可以在 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"
    

    注意

    在此範例中,IoT Edge 會在「每次」需要取得憑證時,使用使用者名稱和密碼向 EST 伺服器進行驗證。 在生產環境中則不建議使用此方法,因為 1) 其需要以純文字儲存秘密,以及 2) IoT Edge 也應該使用身分識別憑證向 EST 伺服器進行驗證。 若要針對生產環境來進行修改:

    1. 請考慮使用可在製造期間儲存到裝置上的長期「啟動程序憑證」類似於針對 DPS 所建議的方法。 若要了解如何為 EST 伺服器設定啟動程序憑證,請參閱使用透過 EST 動態發行的憑證來驗證裝置 (英文)。
    2. 使用與上述佈建憑證自動更新組態相同的語法 (英文) 來設定 [cert_issuance.est.identity_auto_renew]

    如此一來,IoT Edge 憑證服務就會使用啟動程序憑證向 EST 伺服器進行初始驗證,並要求身分識別憑證以在未來向相同伺服器提出 EST 要求。 如果基於某些原因,EST 身分識別憑證在更新前就到期,IoT Edge 會回復為使用啟動程序憑證。

  3. 執行 sudo iotedge config apply 以套用新的設定。

  4. 執行 sudo iotedge check 以確認您的 IoT Edge 裝置組態。 所有「組態檢查」應該都會成功。 在本教學課程中,您可以忽略生產環境整備錯誤和警告、DNS 伺服器警告和連線能力檢查。

  5. 瀏覽至 IoT 中樞內的裝置。 憑證指紋已使用 DPS 和 EST 伺服器自動新增至裝置了。

    螢幕擷取畫面:Azure 入口網站中 IoT 中樞裝置設定。憑證指紋欄位顯示值。

    注意

    當您建立新的 IoT Edge 裝置時,其會顯示狀態碼 417 -- The device's deployment configuration is not set in the Azure portal.這是正常狀態,表示裝置已準備好接收模組部署。

測試憑證更新

您可以從裝置內移除現有憑證和金鑰,然後套用 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 中樞內的裝置。 憑證指紋已更新。

    螢幕擷取畫面:Azure 入口網站中 IoT 中樞裝置設定。憑證指紋欄位顯示新的值。

  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. 請嘗試等候一天,讓憑證到期。 測試 EST 伺服器會設定為建立一天後到期的憑證。 IoT Edge 會自動更新憑證。
  2. 請嘗試為 config.toml 中所設定的自動更新調整 threshold 中的百分比 (範例組態目前設定為 80%)。 例如,將其設定為 10%,並每隔大約 2 小時觀察一次憑證的更新。
  3. 請嘗試將 threshold 調整為後接 m (分鐘) 的整數。 例如,將其設定為 60m,並在到期前 1 小時觀察憑證的更新。

清除資源

您可以保留您在本教學課程中建立的資源和組態,並加以重複使用。 否則,可以刪除您在本文中使用的本機設定和 Azure 資源,以避免產生費用。

刪除 Azure 資源

刪除 Azure 資源和資源群組是無法回復的動作。 請確定您不會誤刪錯誤的資源群組或資源。 如果您在現有的資源群組內建立了 IoT 中樞,而該群組包含您想要保留的資源,則您只需刪除 IoT 中樞資源本身,而不要刪除資源群組。

若要刪除資源:

  1. 登入 Azure 入口網站,然後選取 [資源群組]

  2. 選取您的 IoT Edge 測試資源所屬的資源群組名稱。

  3. 檢閱您的資源群組中包含的資源清單。 若要將其全部刪除,您可以選取 [刪除資源群組]。 如果只要刪除某些部分,您可以按一下各個資源將其個別刪除。

下一步