教學課程:為 Azure IoT Edge 設定透過安全傳輸的註冊伺服器
適用於: IoT Edge 1.5 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 群組註冊
- 設定裝置
必要條件
- 已安裝最新 Azure IoT Edge 執行階段 (部分機器翻譯) 的現有 IoT Edge 裝置。 如果您需要建立測試裝置,請完成快速入門:將您的第一個 IoT Edge 模組部署至虛擬 Linux 裝置 (部分機器翻譯)。
- 您的 IoT Edge 裝置需要 Azure IoT Edge 執行階段 1.2 或更新版本,才能獲得 EST 支援。 若要更新 EST 憑證,則需要 Azure IoT Edge 執行階段 1.3 或更新版本。
- 連結至 IoT 中樞的 IoT 中樞裝置佈建服務 (DPS)。 如需如何設定 DPS 的相關資訊,請參閱 快速入門:使用 Azure 入口網站設定 IoT 中樞裝置佈建服務。
注意
若要使用 EST 和 IoT Edge 進行自動裝置身分識別憑證發行和更新,建議用於生產環境,IoT Edge 必須佈建為 DPS CA 型註冊群組的一部分。 其他布建方法,包括手動布建具有 IoT 中樞的 X.509,以及具有個別註冊的 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。
連線到已安裝 IoT Edge 的裝置 (例如使用 SSH)。
建立名為
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
在包含
Dockerfile
的目錄中,從範例 Dockerfile 建置映像。sudo docker build . --tag est
啟動容器,並將容器的連接埠 8085 公開至主機上的連接埠 8085。
sudo docker run -d -p 8085:8085 est
現在,您的 EST 伺服器正在執行,而且可以在連接埠 8085 上使用
localhost
來與其連線。 確認 EST 伺服器可供使用,方法是執行命令來查看其伺服器憑證。openssl s_client -showcerts -connect localhost:8085
您應該會在輸出的中間位置看到
-----BEGIN CERTIFICATE-----
。 擷取憑證會驗證伺服器是否可供連線,而且可以呈現其憑證。
提示
若要在雲端中執行此容器,請建置映像,並將映像推送至 Azure Container Registry。 然後,遵循用來部署至 Azure 容器執行個體的快速入門。
下載 CA 憑證
每個裝置都需要與裝置身分識別憑證相關聯的憑證授權單位 (CA) 憑證。
在 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
從 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
憑證應該為金鑰服務使用者「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
如果您沒有連結至 IoT 中樞的裝置佈建服務,請參閱快速入門:使用 Azure 入口網站設定 IoT 中樞裝置佈建服務。
將
cacert.crt.pem
檔案從裝置傳輸到可存取 Azure 入口網站的電腦,例如您的開發電腦。 傳輸憑證的簡單方式是遠端連線到裝置、使用命令cat /var/aziot/certs/cacert.crt.pem
顯示憑證、複製整個輸出,然後將內容貼到開發電腦上的新檔案。在 Azure 入口網站中,導覽至 IoT 中樞裝置佈建服務的執行個體。
在 [設定] 底下,依序選取 [憑證] 和 [+新增]。
設定 值 憑證名稱 為 CA 憑證提供自訂名稱 .pem 或 .cer 憑證檔案 從 EST 伺服器瀏覽至 cacert.crt.pem
在上傳時將憑證狀態設定為已驗證 選取核取方塊 選取 [儲存]。
建立註冊群組
在 Azure 入口網站中,導覽至 IoT 中樞裝置佈建服務的執行個體。
在 [設定] 下方,選取 [管理註冊]。
選取 [新增註冊群組],然後完成下列步驟以設定註冊。
在 [註冊 + 佈建] 索引標籤上,選擇下列設定:
設定 值 證明機制 選取 [上傳至此裝置佈建服務執行個體的 X.509 憑證] 主要憑證 從挑選清單中選擇您的憑證 群組名稱 為這個群組註冊提供自訂名稱 佈建狀態 選取 [啟用此註冊] 核取方塊 在 [IoT 中樞] 索引標籤上,從清單中選擇您的 IoT 中樞。
在 [裝置設定] 索引標籤上,選取 [在已佈建的裝置上啟用 IoT Edge] 核取方塊。
其他設定與本教學課程無關。 您可以接受預設設定。
選取 [檢閱 + 建立]。
現在裝置已有註冊了,因此 IoT Edge 執行階段可以自動管理所連結 IoT 中樞的裝置憑證。
設定 IoT Edge 裝置
在 IoT Edge 裝置上,更新 IoT Edge 組態檔,以使用來自 EST 伺服器的裝置憑證。
使用編輯器開啟 IoT Edge 組態檔。 例如,使用
nano
編輯器開啟/etc/aziot/config.toml
檔案。sudo nano /etc/aziot/config.toml
在組態檔中新增或取代下列區段。 這些組態設定一開始會使用「使用者名稱和密碼」驗證,從 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 伺服器進行驗證。 若要針對生產環境來進行修改:
- 請考慮使用可在製造期間儲存到裝置上的長期「啟動程序憑證」,類似於針對 DPS 所建議的方法。 若要了解如何為 EST 伺服器設定啟動程序憑證,請參閱使用透過 EST 動態發行的憑證來驗證裝置 (英文)。
- 使用與上述佈建憑證自動更新組態相同的語法 (英文) 來設定
[cert_issuance.est.identity_auto_renew]
。
如此一來,IoT Edge 憑證服務就會使用啟動程序憑證向 EST 伺服器進行初始驗證,並要求身分識別憑證以在未來向相同伺服器提出 EST 要求。 如果基於某些原因,EST 身分識別憑證在更新前就到期,IoT Edge 會回復為使用啟動程序憑證。
執行
sudo iotedge config apply
以套用新的設定。執行
sudo iotedge check
以確認您的 IoT Edge 裝置組態。 所有「組態檢查」應該都會成功。 在本教學課程中,您可以忽略生產環境整備錯誤和警告、DNS 伺服器警告和連線能力檢查。瀏覽至 IoT 中樞內的裝置。 憑證指紋已使用 DPS 和 EST 伺服器自動新增至裝置了。
注意
當您建立新的 IoT Edge 裝置時,其會顯示狀態碼
417 -- The device's deployment configuration is not set in the Azure portal.
這是正常狀態,表示裝置已準備好接收模組部署。
測試憑證更新
您可以從裝置內移除現有憑證和金鑰,然後套用 IoT Edge 組態,以立即重新發行裝置身分識別憑證。 IoT Edge 會偵測到遺失的檔案,並要求新的憑證。
在 IoT Edge 裝置上,停止 IoT Edge 執行階段。
sudo iotedge system stop
刪除現有憑證和金鑰。
sudo sh -c "rm /var/lib/aziot/certd/certs/*" sudo sh -c "rm /var/lib/aziot/keyd/keys/*"
套用 IoT Edge 組態以更新憑證。
sudo iotedge config apply
您可能需要等候幾分鐘,執行階段才會啟動。
瀏覽至 IoT 中樞內的裝置。 憑證指紋已更新。
使用命令
sudo ls -l /var/lib/aziot/certd/certs
列出憑證檔案。 您應該會看到裝置憑證檔案的最近建立日期。使用
openssl
命令來檢查新的憑證內容。 例如:sudo openssl x509 -in /var/lib/aziot/certd/certs/deviceid-bd732105ef89cf8edd2606a5309c8a26b7b5599a4e124a0fe6199b6b2f60e655.cer -text -noout
將裝置憑證檔案名稱 (.cer) 取代為您裝置的憑證檔案。
您應該會注意到憑證「有效」的日期範圍已變更。
以下是您可以選擇用來測試憑證更新的其他方式。 這些檢查會示範 IoT Edge 在憑證到期或遺失時,如何從 EST 伺服器更新憑證。 在每次測試之後,您可以在 Azure 入口網站中驗證新的指紋,並使用 openssl
命令來驗證新的憑證。
- 請嘗試等候一天,讓憑證到期。 測試 EST 伺服器會設定為建立一天後到期的憑證。 IoT Edge 會自動更新憑證。
- 請嘗試為
config.toml
中所設定的自動更新調整threshold
中的百分比 (範例組態目前設定為 80%)。 例如,將其設定為10%
,並每隔大約 2 小時觀察一次憑證的更新。 - 請嘗試將
threshold
調整為後接m
(分鐘) 的整數。 例如,將其設定為60m
,並在到期前 1 小時觀察憑證的更新。
清除資源
您可以保留您在本教學課程中建立的資源和組態,並加以重複使用。 否則,可以刪除您在本文中使用的本機設定和 Azure 資源,以避免產生費用。
刪除 Azure 資源
刪除 Azure 資源和資源群組是無法回復的動作。 請確定您不會誤刪錯誤的資源群組或資源。 如果您在現有的資源群組內建立了 IoT 中樞,而該群組包含您想要保留的資源,則您只需刪除 IoT 中樞資源本身,而不要刪除資源群組。
若要刪除資源:
登入 Azure 入口網站,然後選取 [資源群組]。
選取您的 IoT Edge 測試資源所屬的資源群組名稱。
檢閱資源群組所包含的資源清單。 若要將其全部刪除,您可以選取 [刪除資源群組]。 如果只想刪除某些部分,則可以選取各個資源以將其個別刪除。
下一步
- 若要使用 EST 伺服器來發行 Edge CA 憑證,請參閱範例組態 (英文)。
- 不建議在生產環境中使用使用者名稱和密碼來啟動向 EST 伺服器進行的驗證。 相反地,請考慮使用可在製造期間儲存到裝置上的長期「啟動程序憑證」,類似於針對 DPS 所建議的方法。 若要了解如何為 EST 伺服器設定啟動程序憑證,請參閱使用透過 EST 動態發行的憑證來驗證裝置 (英文)。
- EST 伺服器也可用來為階層中的所有裝置發行憑證。 視您是否有 ISA-95 需求而定,您可能必須在每一層執行具有此項目的 EST 伺服器鏈結,或使用 API Proxy 模組來轉送要求。 若要深入了解,請參閱 Kevin 的部落格 (英文)。
- 針對企業級解決方案,請考慮:GlobalSign IoT Edge 註冊、DigiCert IoT 裝置管理員 和 Keytos EZCA。
- 若要深入了解憑證,請參閱了解 Azure IoT Edge 如何使用憑證 (部分機器翻譯)。