IoT 中樞的傳輸層安全性 (TLS) 支援
IoT 中樞使用傳輸層安全性 (TLS) 來保護 IoT 裝置和服務的連線。 目前支援三種 TLS 通訊協定版本,亦即 1.0、1.1 和 1.2 版。
TLS 1.0 和 1.1 被視為舊版,並已規劃淘汰。 如需詳細資訊,請參閱 IoT 中樞即將淘汰 TLS 1.0 和 1.1。 若要避免未來發生問題,請在連線到 IoT 中樞時,使用 TLS 1.2 作為唯一的 TLS 版本。
IoT 中樞的伺服器 TLS 憑證
在 TLS 交握期間,IoT 中樞 向連線用戶端呈現 RSA 金鑰的伺服器憑證。 全域 Azure 雲端中的所有 IoT 中樞都會使用 DigiCert Global Root G2 所簽發的 TLS 憑證。
我們也建議將 Microsoft RSA 跟證書授權單位 2017 憑證新增至您的裝置,以避免在 DigiCert Global Root G2 意外淘汰時中斷。 雖然根 CA 移轉很少見,但若要在新式安全性環境中進行復原,您應該要為不太可能發生根 CA 遭到入侵或需要進行緊急根 CA 移轉的情況準備 IoT 案例。
強烈建議所有裝置都信任下列根 CA:
- DigiCert Global G2 根 CA
- Microsoft RSA 根 CA 2017
如需下載這些憑證的連結,請參閱 Azure 憑證授權單位詳細資料。
SDK 中的憑證信任
Azure IoT 裝置 SDK 會將裝置連線並驗證至 Azure IoT 服務。 不同的 SDK 會根據語言和版本以不同的方式管理憑證,但大部分會依賴裝置的受信任證書存儲,而不是直接在程式碼基底中釘選憑證。 此方法提供彈性和復原能力,以處理跟證書的未來變更。
下表摘要說明哪些 SDK 版本支援受信任的證書儲存:
Azure IoT 裝置 SDK | 支援的版本 |
---|---|
C | 所有目前支援的版本 |
C# | 所有目前支援的版本 |
Java | 版本 2.x.x 和更新版本 |
Node.js | 所有目前支援的版本 |
Python | 所有目前支援的版本 |
憑證釘選
不建議使用 TLS 伺服器證書的憑證釘選和篩選(也稱為分葉憑證)和與 IoT 中樞 端點相關聯的中繼憑證,因為Microsoft經常以很少或沒有通知方式擲回這些憑證。 如果您必須,則只釘選跟證書。
橢圓曲線加密 (ECC) 伺服器 TLS 憑證 (預覽)
IoT 中樞 ECC 伺服器 TLS 憑證可用於公開預覽。 雖然提供的安全性與 RSA 憑證類似,但 ECC 憑證驗證 (使用僅限 ECC 加密套件) 最多使用 40% 的計算、記憶體和頻寬。 這些節省下來的資源對於 IoT 裝置而言非常重要,因為這些裝置的設定檔和記憶體都比較小,而且還可以支援網路頻寬有限環境中的使用案例。
強烈建議讓使用 ECC 的所有裝置都信任下列這兩個根 CA:
- DigiCert Global G3 根 CA
- Microsoft RSA 根 CA 2017
如需下載這些憑證的連結,請參閱 Azure 憑證授權單位詳細資料。
若要預覽 IoT 中樞的 ECC 伺服器憑證:
- 啟用預覽模式建立新 IoT 中樞。
- 設定您的用戶端,只包含 ECDSA 加密套件並排除任何 RSA 加密套件。 以下是 ECC 憑證公開預覽版支援的加密套件:
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
- 將用戶端連線至預覽 IoT 中樞。
可在選取區域中使用 TLS 1.2 強制執行
為提高安全性,請將 IoT 中樞設定為只允許使用 TLS 1.2 版的用戶端連線,並強制使用加密套件。 只有這些區域支援此功能:
- 美國東部
- 美國中南部
- 美國西部 2
- US Gov 亞利桑那州
- US Gov 維吉尼亞州 (此區域無法使用 TLS 1.0/1.1 支援 - 必須啟用 TLS 1.2 強制執行,否則會發生 IoT 中樞建立失敗)
若要啟用 TLS 1.2 強制執行,請遵循在 Azure 入口網站中建立 IoT 中樞中的步驟,但下列情況除外
從上述清單中選擇其中一個區域。
在 [管理 -> 進階 -> 傳輸層安全性 (TLS) -> 最低 TLS 版本] 下方,選取 [1.2]。 只有在支援的區域中建立的 IoT 中樞才會顯示此設定。
若要使用 ARM 範本建立,請在任何支援的區域中佈建新的 IoT 中樞,並在資源規格中將 minTlsVersion
屬性設定為 1.2
:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Devices/IotHubs",
"apiVersion": "2020-01-01",
"name": "<provide-a-valid-resource-name>",
"location": "<any-of-supported-regions-below>",
"properties": {
"minTlsVersion": "1.2"
},
"sku": {
"name": "<your-hubs-SKU-name>",
"tier": "<your-hubs-SKU-tier>",
"capacity": 1
}
}
]
}
使用此組態建立 IoT 中樞 資源會拒絕嘗試使用 TLS 1.0 和 1.1 版連線的裝置和服務用戶端。 同樣地,如果 ClientHello
訊息未列出任何 建議的加密,就會拒絕 TLS 交握。
注意
minTlsVersion
屬性是唯讀的,且無法在建立 IoT 中樞資源之後變更。 因此,您必須事先適當地測試並驗證「所有」IoT 裝置和服務都符合 TLS 1.2 和建議的加密規範。
容錯移轉之後,您 IoT 中樞的 minTlsVersion
屬性會在容錯移轉後的異地配對區域中維持有效。
加密套件
設定為只接受 TLS 1.2 的 IoT 中樞,也會強制使用下列建議的加密套件:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
對於未設定 TLS 1.2 強制執行的 IoT 中樞,仍可使用 TLS 1.2 搭配下列加密套件:
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_3DES_EDE_CBC_SHA
(此加密將於 2022 年 10 月 1 日淘汰,不再用於 TLS 交握)
用戶端可以建議較高階的加密套件清單,以便在 ClientHello
期間使用。 但 IoT 中樞可能並不支援其中部分套件 (例如,ECDHE-ECDSA-AES256-GCM-SHA384
)。 在此情況下,IoT 中樞 會嘗試遵循用戶端的喜好設定,但最終會與 ServerHello
交涉到加密套件。
SDK 和 IoT Edge 的 TLS 設定
使用下列連結,在 IoT 中樞 用戶端 SDK 中設定 TLS 1.2 和允許的加密。
語言 | 支援 TLS 1.2 的版本 | 文件 |
---|---|---|
C | 標記 2019-12-11 或更新版本 | 連結 |
Python | 2.0.0 版或更新版本 | 連結 |
C# | 1.21.4 版或更新版本 | 連結 |
Java | 1.19.0 版或更新版本 | 連結 |
NodeJS | 1.12.2 版或更新版本 | 連結 |
您可將 IoT Edge 裝置設定為使用 TLS 1.2 來與 IoT 中樞通訊。 基於此目的,請使用 IoT Edge 文件頁面。
裝置驗證
TLS 交握成功之後,IoT 中樞就可以使用對稱金鑰或 X.509 憑證來驗證裝置。 對於憑證型驗證,可以使用任何 X.509 憑證,包括 ECC。 IoT 中樞會根據您提供的指紋或憑證授權單位 (CA) 來驗證憑證。 若要深入了解,請參閱支援的 X.509 CA 憑證。
相互 TLS 支援
相互 TLS 驗證可確保用戶端會「驗證」伺服器 (IoT 中樞) 憑證,且伺服器 (IoT 中樞) 會「驗證」X.509 用戶端憑證或 X.509 指紋。 IoT 中樞會在「驗證」完成之後執行「授權」。
針對 AMQP 和 MQTT 通訊協定,IoT 中樞會在初始 TLS 交握中要求用戶端憑證。 如已提供,IoT 中樞就會「驗證」用戶端憑證,而用戶端會「驗證」IoT 中樞憑證。 此流程稱為相互 TLS 驗證。 當 IoT 中樞收到 MQTT 連線封包或 AMQP 連結開啟時,IoT 中樞就會針對要求用戶端執行「授權」,並判斷用戶端是否需要 X.509 驗證。 如果相互 TLS 驗證完成,且用戶端已獲授權來以裝置身分連線,即已允許。 不過,如果用戶端要求 X.509 驗證,且未在 TLS 交握期間完成用戶端驗證,則 IoT 中樞會拒絕連線。
針對 HTTP 通訊協定,當用戶端提出第一個要求時,IoT 中樞會檢查該用戶端是否要求 X.509 驗證,以及用戶端驗證是否完成,接著,IoT 中樞會執行授權。 如果用戶端驗證並未完成,則 IoT 中樞會拒絕連線
TLS 最大片段長度交涉 (預覽)
IoT 中樞也支援 TLS 最大片段長度交涉,有時這稱為 TLS 框架大小交涉。 此功能處於公開預覽狀態。
使用這項功能,將純文字片段長度上限指定為小於預設 2^14 個位元組的值。 交涉之後,IoT 中樞和用戶端就會開始將訊息分段,以確保所有片段都小於交涉的長度。 此行為對於有計算或記憶體限制的裝置,很有幫助。 若要深入了解,請參閱官方 TLS 延伸模組規格。
目前尚未提供這個公開預覽功能的官方 SDK 支援。 開始使用
- 啟用預覽模式建立新 IoT 中樞。
- 使用 OpenSSL 時,請呼叫 SSL_CTX_set_tlsext_max_fragment_length 以指定片段大小。
- 將用戶端連線至預覽 IoT 中樞。
下一步
- 若要深入了解 IoT 中樞安全性和存取控制,請參閱控制 IoT 中樞的存取權。
- 若要深入了解如何使用 X509 憑證進行裝置驗證,請參閱使用 X.509 CA 憑證進行裝置驗證