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

適用于:IoT Edge 1.4 核取記號IoT Edge 1.4

重要

支援的版本是 IoT Edge 1.4。 如果您是舊版,請參閱更新 IoT Edge

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

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

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

清除資源

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

刪除 Azure 資源

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

若要刪除資源:

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

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

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

後續步驟