將下游裝置連線到 Azure IoT Edge 閘道
適用於: IoT Edge 1.1
重要
IoT Edge 1.1 終止支援日期為 2022 年 12 月 13 日。 如需此產品、服務、技術或 API 的支援資訊,請參閱 Microsoft 產品生命週期。 如需更新至最新版IoT Edge的詳細資訊,請參閱 更新IoT Edge。
本文提供在下游裝置與IoT Edge透明閘道之間建立受信任連線的指示。 在透明閘道案例中,一或多部裝置可以透過與 IoT 中樞保持連線的單一閘道裝置傳遞訊息。
設定成功的透明閘道連線有三個一般步驟。 本文涵蓋第三個步驟:
將閘道裝置設定為伺服器,讓下游裝置可以安全地與其連線。 設定閘道以接收來自下游裝置的訊息,並路由傳送至適當的目的地。 關於這些步驟,請參閱設定 IoT Edge 裝置作為透明閘道。
建立下游裝置的裝置身分識別,以便透過 IoT 中樞進行驗證。 將下游裝置設定為透過閘道裝置傳送訊息。 如需這些步驟的說明,請參閱向 Azure IoT 中樞驗證下游裝置。
將下游裝置連線到閘道裝置並開始傳送訊息。
本文討論下游裝置連線的基本概念,並引導您透過下列方式設定下游裝置:
- 說明傳輸層安全性 (TLS) 和憑證的基本概念。
- 說明 TLS 程式庫在不同作業系統之間的運作方式,以及每個作業系統處理憑證的方式。
- 逐步解說數種語言的 Azure IoT 範例,以協助您開始使用。
在本文中,閘道和IoT Edge閘道詞彙是指設定為透明網關的IoT Edge裝置。
注意
下游裝置會將資料直接發出至網際網路或網路閘道裝置 (已啟用或未啟用 IoT Edge)。 子裝置可以是巢狀拓撲中的下游裝置或閘道裝置。
必要條件
- 具有用來在設定IoT Edge裝置中 產生裝置 CA 憑證的根 CA 憑證檔案,以作為下游裝置上可用的透明網關 。 下游裝置會使用此憑證來驗證閘道裝置的身分識別。 如果您使用示範憑證,則根 CA 憑證稱為 azure-iot-test-only.root.ca.cert.pem。
- 已修改的 連接字串 指向閘道裝置,如驗證下游裝置以 Azure IoT 中樞 中所述。
準備下游裝置
下游裝置可以是使用 Azure IoT 中樞雲端服務建立身分識別的任何應用程式或平台。 在許多情況下,這些應用程式都會使用 Azure IoT 裝置 SDK。 下游裝置甚至可以是在 IoT Edge 閘道裝置本身中執行的應用程式。 不過,另一部 IoT Edge 裝置不能位在 IoT Edge 閘道下游。
注意
已向 IoT 中樞註冊的 IoT 裝置可以使用模組對應項,在單一裝置上隔離不同的流程、硬體或功能。 IoT Edge 閘道使用對稱金鑰驗證支援下游模組連線,但不使用 X.509 憑證驗證。
若要將下游裝置連線到 IoT Edge 閘道,您需要具備兩樣東西:
使用附加資訊的 IoT 中樞裝置連接字串設定的裝置或應用程式,可將其連線至閘道。
此步驟已在上一篇文章中完成:驗證下游裝置以 Azure IoT 中樞。
裝置或應用程式必須信任閘道的 根 CA 憑證 ,才能驗證閘道裝置的傳輸層安全性 (TLS) 連線。
本文後面會詳細說明此步驟。 此步驟可以透過以下方式之一執行:安裝作業系統憑證存放區中的 CA 憑證或 (針對某些語言) 使用 Azure IoT SDK 參考應用程式中的憑證。
TLS 和憑證基本概念
安全地將下游裝置連線到 IoT Edge 的挑戰,如同網際網路上發生的其他任何安全用戶端/伺服器通訊。 用戶端和伺服器會透過網際網路,使用傳輸層安全性 (TLS) 安全地進行通訊。 TLS 是使用標準公開金鑰基礎結構 (PKI) 建構 (稱為憑證) 建置的。 TLS 是相當複雜的規格,而且可以處理與保護兩個端點安全相關的各種主題。 本節會摘要說明將裝置安全地連線到 IoT Edge 閘道的相關概念。
當用戶端連線到伺服器時,伺服器會顯示一連串的憑證,稱為伺服器憑證鏈結。 憑證鏈結通常會包含根憑證授權單位 (CA) 憑證、一個或多個中繼 CA 憑證,以及最後的伺服器憑證本身。 用戶端會以密碼編譯方式驗證整個伺服器憑證鏈結,藉此建立與伺服器的信任。 這種伺服器憑證鏈結的用戶端驗證稱為「伺服器鏈結驗證」。 用戶端會挑戰服務,使用稱為「擁有權證明」的流程證明擁有與伺服器憑證相關聯的私密金鑰。 伺服器鏈結驗證和擁有權證明的組合稱為「伺服器驗證」。 若要驗證伺服器憑證鏈結,用戶端需要一份用來建立 (或核發) 伺服器憑證的根 CA 憑證。 一般而言,當連線到網站時,瀏覽器已預先設定常用的 CA 憑證,讓用戶端的程序順暢進行。
當裝置連線到 Azure IoT 中樞時,該裝置就是用戶端,而 IoT 中樞雲端服務則是伺服器。 IoT 中樞雲端服務是以稱為 Baltimore CyberTrust Root 的根 CA 憑證作為後盾,這是公開可用且最廣泛使用的憑證。 大多數裝置上已安裝 IoT 中樞 CA 憑證,因此許多 TLS 實作 (OpenSSL、Schannel、LibreSSL) 會自動在伺服器憑證驗證期間使用該憑證。 不過,成功連線到 IoT 中樞的裝置在嘗試連線到 IoT Edge 閘道時可能會發生問題。
當裝置連線到 IoT Edge 閘道時,下游裝置就是用戶端,而閘道裝置則是伺服器。 但是,Azure IoT Edge 可讓您建置他們認為合適的閘道憑證鏈結。 您可以選擇使用公用 CA 憑證 (例如 Baltimore),或使用自我簽署 (或內部) 的根 CA 憑證。 公用 CA 憑證通常會有與其相關聯的成本,因此通常用於實際執行案例中。 自我簽署的 CA 憑證慣用於開發和測試。 如果您使用示範憑證,這些憑證是自我簽署的根 CA 憑證。
當您將自我簽署的根 CA 憑證用於 IoT Edge 閘道時,它必須安裝在或提供給嘗試連線到閘道的所有下游裝置。
若要深入了解 IoT Edge 憑證以及一些實際執行的影響,請參閱 IoT Edge 憑證使用方式詳細資料。
提供根 CA 憑證
若要驗證閘道裝置的憑證,下游裝置需要自己的根 CA 憑證複本。 如果使用 IoT Edge git 存放庫所提供的指令碼建立測試憑證,則根 CA 憑證稱為 azure-iot-test-only.root.ca.cert.pem。 如果尚未加入其他下游裝置的準備步驟,請將此憑證檔案移至下游裝置的任何目錄。 您可使用如 Azure Key Vault 的服務或類似安全複製通訊協定等功能來移動憑證檔案。
安裝 OS 的憑證
一旦根 CA 憑證位於下游裝置上,您必須確定連線到閘道的應用程式可以存取憑證。
安裝作業系統憑證存放區中的根 CA 憑證通常可讓大部分的應用程式使用根 CA 憑證。 但有一些例外,例如 NodeJS 應用程式就不使用作業系統憑證存放區,而是使用節點執行階段的內部憑證存放區。 如果您無法在作業系統層級安裝憑證,請直接跳至搭配 Azure IoT SDK 使用憑證。
Ubuntu
下列命令是如何在 Ubuntu 主機上安裝 CA 憑證的範例。 此範例假設您將使用先決條件相關文章中的 azure-iot-test-only.root.ca.cert.pem 憑證,而且您已經將憑證複製到下游裝置的位置。
sudo cp <path>/azure-iot-test-only.root.ca.cert.pem /usr/local/share/ca-certificates/azure-iot-test-only.root.ca.cert.pem.crt
sudo update-ca-certificates
您應該會看到一則訊息,指出「正在更新 /etc/ssl/certs 中的憑證...已新增 1 個憑證,已移除 0 個憑證;完成。」
Windows
下列步驟是如何在 Windows 主機上安裝 CA 憑證的範例。 此範例假設您將使用先決條件相關文章中的 azure-iot-test-only.root.ca.cert.pem 憑證,而且您已經將憑證複製到下游裝置的位置。
您可以管理員身分使用 PowerShell 的 Import-Certificate 安裝憑證:
import-certificate <file path>\azure-iot-test-only.root.ca.cert.pem -certstorelocation cert:\LocalMachine\root
也可以使用 certlm 公用程式安裝憑證:
- 在 [開始] 功能表中,搜尋並選取 [管理電腦憑證]。 稱為 certlm 的公用程式隨即開啟。
- 瀏覽至 [憑證 - 本機電腦]>[信任的根憑證授權單位]。
- 在 [憑證] 上按一下滑鼠右鍵,然後選取 [所有工作]>[匯入]。 憑證匯入精靈應該會啟動。
- 請依照所指示的步驟,匯入憑證檔案
<path>/azure-iot-test-only.root.ca.cert.pem
。 完成時,您應該會看到「已成功匯入」訊息。
您也可以使用 .NET API,以程式設計方式安裝憑證,如本文稍後的 .NET 範例中所示。
應用程式通常會使用 Windows 提供的 TLS 堆疊 (稱為 Schannel),透過 TLS 安全地連線。 通道要求在嘗試建立 TLS 連線之前,必須先在 Windows 證書存儲中安裝任何憑證。
使用具有 Azure IoT SDK 的憑證
本節說明 Azure IoT SDK 如何使用簡單的範例應用程式連線到 IoT Edge 裝置。 所有範例的目標是將裝置用戶端連線,並將遙測訊息傳送至閘道,然後關閉連線並結束。
使用應用層級範例之前,請先備妥兩件事:
下游裝置的 IoT 中樞 連接字串 已修改為指向閘道裝置,以及驗證下游裝置以 IoT 中樞 所需的任何憑證。 如需詳細資訊,請參閱向 Azure IoT 中樞驗證下游裝置。
您複製並儲存在下游裝置上某個位置之根 CA 憑證的完整路徑。
例如:
<path>/azure-iot-test-only.root.ca.cert.pem
。
NodeJS
本節提供將 Azure IoT NodeJS 裝置用戶端連線到 IoT Edge 閘道的範例應用程式。 針對 NodeJS 應用程式,您必須在應用程式層級安裝根 CA 憑證,如這裡所示。 NodeJS 應用程式不會使用系統的憑證存放區。
- 從適用於 Node.js 的 Azure IoT 裝置 SDK 範例存放庫取得 edge_downstream_device.js 的範例。
- 請檢閱 readme.md 檔案,以確定您擁有執行此範例的所有先決條件。
- 在 edge_downstream_device.js 檔案中,更新 connectionString 和 edge_ca_cert_path 變數。
- 如需如何在裝置上執行此範例的指示,請參閱 SDK 文件。
若要了解您正在執行的範例,下列程式碼片段是用戶端 SDK 讀取憑證檔案,並將其用於建立安全 TLS 連線的方式:
// Provide the Azure IoT device client via setOptions with the X509
// Edge root CA certificate that was used to setup the Edge runtime
var options = {
ca : fs.readFileSync(edge_ca_cert_path, 'utf-8'),
};
.NET
本節介紹將 Azure IoT .NET 裝置用戶端連線到 IoT Edge 閘道的範例應用程式。 不過,.NET 應用程式可以在 Linux 和 Windows 主機上,自動使用系統憑證存放區中任何已安裝的憑證。
- 從 IoT Edge .NET 範例資料夾取得 EdgeDownstreamDevice 的範例。
- 請檢閱 readme.md 檔案,以確定您擁有執行此範例的所有先決條件。
- 在 Properties / launchSettings.json 檔案中,更新 DEVICE_CONNECTION_STRING 和 CA_CERTIFICATE_PATH 變數。 如果您想要在主機系統上使用受信任憑證存放區中安裝的憑證,請將此變數留空。
- 如需如何在裝置上執行此範例的指示,請參閱 SDK 文件。
若要以程式設計方式,透過 .NET 應用程式安裝憑證存放區中受信任的憑證,請參閱 EdgeDownstreamDevice / Program.cs 檔案中的 InstallCACert() 函式。 此作業具有等冪性,因此可以使用相同值多次執行,而且沒有其他效果。
C
本節介紹將 Azure IoT C 裝置用戶端連線到 IoT Edge 閘道的範例應用程式。 C SDK 可以使用許多 TLS 程式庫運作,包括 OpenSSL、WolfSSL 和 Schannel。 如需詳細資訊,請參閱 Azure IoT C SDK。
- 從適用於 C 的 Azure IoT 裝置 SDK 範例取得 iotedge_downstream_device_sample 應用程式。
- 請檢閱 readme.md 檔案,以確定您擁有執行此範例的所有先決條件。
- 在 iotedge_downstream_device_sample.c 檔案中,更新 connectionString 和 edge_ca_cert_path 變數。
- 如需如何在裝置上執行此範例的指示,請參閱 SDK 文件。
適用於 C 的 Azure IoT 裝置 SDK 可以選擇在設定用戶端時註冊 CA 憑證。 這項作業不會在任何位置安裝憑證,而是使用記憶體中憑證的字串格式。 建立連線時,會將已儲存的憑證提供給基礎 TLS 堆疊。
(void)IoTHubDeviceClient_SetOption(device_handle, OPTION_TRUSTED_CERT, cert_string);
注意
如果使用受控套件或程式庫,設定用戶端時註冊 CA 憑證的方法可以變更。 例如,Arduino IDE 型程式庫需要將 CA 憑證新增至全域 certs.c 檔案中定義的憑證陣列,而不是使用 IoTHubDeviceClient_LL_SetOption
作業。
在 Windows 主機上,如果您使用的不是 OpenSSL 或另一個 TLS 程式庫,則 SDK 會預設使用 Schannel。 若要讓 Schannel 運作,則應該安裝 Windows 憑證存放區中的 IoT Edge 根 CA 憑證,而不是使用 IoTHubDeviceClient_SetOption
作業設定。
Java
本節介紹將 Azure IoT Java 裝置用戶端連線到 IoT Edge 閘道的範例應用程式。
- 從適用於 Java 的 Azure IoT 裝置 SDK 範例取得 Send-event 的範例。
- 請檢閱 readme.md 檔案,以確定您擁有執行此範例的所有先決條件。
- 如需如何在裝置上執行此範例的指示,請參閱 SDK 文件。
Python
本節介紹將 Azure IoT Python 裝置用戶端連線到 IoT Edge 閘道的範例應用程式。
- 從適用於 Python 的 Azure IoT 裝置 SDK 範例取得 send_message_downstream 的範例。
- 設定
IOTHUB_DEVICE_CONNECTION_STRING
和IOTEDGE_ROOT_CA_CERT_PATH
環境變數,如 Python 指令碼註解中所指定。 - 如需如何在裝置上執行範例的其他指示,請參閱 SDK 檔。
測試閘道連線
在下游裝置上使用這個範例命令,來測試其是否可以連線到閘道裝置:
openssl s_client -connect mygateway.contoso.com:8883 -CAfile <CERTDIR>/certs/azure-iot-test-only.root.ca.cert.pem -showcerts
此命令會測試透過 MQTTS 的連線(埠 8883)。 如果您使用不同的通訊協定,請視AMQPS (5671) 或 HTTPS (443) 的必要方式調整命令
此命令的輸出可能很長,包括鏈結中所有憑證的相關資訊。 如果連線成功,您會看到類似 Verification: OK
或 Verify return code: 0 (ok)
的行。
針對閘道連線進行疑難排解
如果您的下游裝置與其閘道裝置有間歇性連線,請嘗試下列步驟以解決問題。
- 連接字串中的閘道主機名稱是否與閘道裝置上 IoT Edge 設定檔中的主機名稱值相同?
- 閘道主機名稱是否可解析為 IP 位址? 您可以使用 DNS 或在下游裝置上新增主機檔案項目來解決間歇性連線。
- 通訊連接埠是否在您的防火牆中開啟? 以所使用通訊協定 (MQTTS:8883/AMQPS:5671/HTTPS:433) 為基礎的通訊,必須可在下游裝置與透明IoT Edge之間進行。
下一步
了解 IoT Edge 如何將離線功能擴充到下游裝置。