教學課程:為 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) 伺服器來管理 x509 憑證。

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

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

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

必要條件

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

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

EST 伺服器

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

重要

針對企業級解決方案,請考慮:GlobalSign IoT Edge 註冊DigiCert IoT 裝置管理員

針對測試和開發,您可以使用測試 EST 伺服器。 在本教學課程中,我們將建立測試 EST 伺服器。

在裝置上執行EST伺服器

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

Dockerfile 使用 Ubuntu 18.04、名為 libest的 Cisco 連結庫,以及範例伺服器程式代碼 其設定方式如下,您可以變更:

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

警告

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

  1. 連線 至裝置,例如使用 SSH,其中已安裝 IoT Edge。

  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 。 執行命令以查看其伺服器證書,以確認其可供使用。

    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. 請嘗試在 中 threshold 調整 中自動更新設定 config.toml 的百分比(目前在範例組態中設定為 80%) 。 例如,將它設定為 10% ,並觀察每 ~2 小時更新憑證。
  3. 請嘗試將 threshold 調整為整數, m 後面接著 (分鐘)。 例如,將它設定為 60m ,並在到期前1小時觀察憑證更新。

清除資源

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

刪除 Azure 資源

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

若要刪除資源:

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

  2. 選取包含IoT Edge測試資源的資源群組名稱。

  3. 檢閱資源群組中包含的資源清單。 如果您想要刪除所有資源群組,您可以選取 [ 刪除資源群組]。 如果您想要只刪除其中一些資源,您可以按下每個資源來個別刪除它們。

下一步