教學課程:為 Azure IoT Edge設定透過安全傳輸伺服器註冊
適用于:IoT Edge 1.4
重要
支援的版本是 IoT Edge 1.4。 如果您是舊版,請參閱更新 IoT Edge。
透過 Azure IoT Edge,您可以將裝置設定為使用透過安全傳輸 (EST) 伺服器註冊來管理 x509 憑證。
本教學課程會逐步引導您裝載測試 EST 伺服器,並設定用於註冊和更新 x509 憑證的IoT Edge裝置。 在本教學課程中,您會了解如何:
- 建立及裝載測試 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 中樞裝置布建服務 (DPS) 連結至IoT 中樞。 如需設定 DPS 的資訊,請參閱快速入門:使用 Azure 入口網站 設定IoT 中樞裝置布建服務。
什麼是透過安全傳輸註冊?
透過安全傳輸 (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。
例如,使用 SSH 連線到您已安裝IoT Edge的裝置。
建立名為
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
。 執行 命令以查看其伺服器憑證,以確認其可供使用。openssl s_client -showcerts -connect localhost:8085
您應該會在輸出中看到
-----BEGIN CERTIFICATE-----
。 擷取憑證會驗證服務器是否可連線,而且可以呈現其憑證。
提示
若要在雲端中執行此容器,請建置映射並將映射推送至Azure Container Registry。 然後,依照 快速入門部署至 Azure 容器實例。
下載 CA 憑證
每個裝置都需要與裝置身分識別憑證相關聯的憑證授權單位單位 (CA) 憑證。
在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
從 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 裝置管理員
- 若要深入瞭解憑證,請參閱瞭解 Azure IoT Edge如何使用憑證。