你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure IoT 中心设备预配服务 (DPS) 中的 TLS 支持

DPS 使用传输层安全性 (TLS) 保护来自 IoT 设备的连接。

DPS 支持的当前 TLS 协议版本如下:

  • TLS 1.2

限制最低 TLS 版本的连接

可将 DPS 实例配置为仅允许使用最低 TLS 版本或更高版本的设备客户端连接

重要

目前,DPS 仅支持 TLS 1.2,因此在创建 DPS 实例时无需指定最低 TLS 版本。 此功能是为将来的扩展提供的。

为此,请预配一个新的 DPS 资源设置,并在 Azure 资源管理器模板的 DPS 资源规范中,将 minTlsVersion 属性设置为 1.2。 以下示例模板 JSON 为新的 DPS 实例指定 minTlsVersion 属性。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Devices/ProvisioningServices",
            "apiVersion": "2020-01-01",
            "name": "<provide-a-valid-DPS-resource-name>",
            "location": "<any-region>",
            "properties": {
                "minTlsVersion": "1.2"
            },
            "sku": {
                "name": "S1",
                "capacity": 1
            },
        }     
    ]
}

可以使用以下 Azure CLI 命令来部署模板。

az deployment group create -g <your resource group name> --template-file template.json

若要详细了解如何使用资源管理器模板来创建 DPS 资源,请参阅使用 Azure 资源管理器模板设置 DPS

使用此配置创建的 DPS 资源会拒绝那些尝试使用 TLS 版本 1.0 和 1.1 进行连接的设备。

备注

minTlsVersion 属性是只读的,创建 DPS 资源后,便不能再更改该属性。 因此,必须事先正确测试并验证你的所有 IoT 设备是否与 TLS 1.2 和建议的密码兼容。

备注

故障转移后,DPS 的 minTlsVersion 属性会在故障转移后的异地配对区域中保持有效。

DPS 实例强制要求使用以下建议的旧版密码套件:

建议的 TLS 1.2 密码套件
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

旧密码套件

DPS 目前仍支持这些密码套件,但未来将停用。 如果可能,请使用建议的密码套件。

选项 1(安全性更好)
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384 (uses SHA-1)
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256 (uses SHA-1)
TLS_RSA_WITH_AES_256_GCM_SHA384 (lack of Perfect Forward Secrecy)
TLS_RSA_WITH_AES_128_GCM_SHA256 (lack of Perfect Forward Secrecy)
TLS_RSA_WITH_AES_256_CBC_SHA256 (lack of Perfect Forward Secrecy)
TLS_RSA_WITH_AES_128_CBC_SHA256 (lack of Perfect Forward Secrecy)
TLS_RSA_WITH_AES_256_CBC_SHA (uses SHA-1, lack of Perfect Forward Secrecy)
TLS_RSA_WITH_AES_128_CBC_SHA (uses SHA-1, lack of Perfect Forward Secrecy)
选项 2(性能更好)
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256 (uses SHA-1)
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384 (uses SHA-1)
TLS_RSA_WITH_AES_128_GCM_SHA256 (lack of Perfect Forward Secrecy)
TLS_RSA_WITH_AES_256_GCM_SHA384 (lack of Perfect Forward Secrecy)
TLS_RSA_WITH_AES_128_CBC_SHA256 (lack of Perfect Forward Secrecy)
TLS_RSA_WITH_AES_256_CBC_SHA256 (lack of Perfect Forward Secrecy)
TLS_RSA_WITH_AES_128_CBC_SHA (uses SHA-1, lack of Perfect Forward Secrecy)
TLS_RSA_WITH_AES_256_CBC_SHA (uses SHA-1, lack of Perfect Forward Secrecy)

相互 TLS 支持

为 X.509 身份验证配置 DPS 注册时,DPS 支持相互 TLS (mTLS)。

服务器 TLS 证书

在 TLS 握手期间,DPS 会向连接的客户端出示 RSA 加密的服务器证书。 全局 Azure 云中的所有 DPS 实例均使用由 DigiCert Global Root G2 证书颁发的 TLS 证书。

同时建议将 Microsoft RSA Root 根证书颁发机构 2017 证书添加到设备中,以防在出现 DigiCert Global Root G2 意外停用的情况下发生中断。 尽管根 CA 迁移很少见,但为了在现代安全环境中具备复原力,你应为根 CA 被泄露或需要紧急根 CA 迁移的不太可能的情况准备 IoT 方案。

强烈建议所有设备信任以下根 CA:

  • DigiCert Global G2 根 CA
  • Microsoft RSA root CA 2017

如需下载这些证书的链接,请参阅 Azure 证书颁发机构详细信息

SDK 中的证书信任

Azure IoT 设备 SDK 将设备连接到 Azure IoT 服务并进行身份验证。 不同的 SDK 根据语言和版本的不同,管理证书的方式也有所不同,但大多数都依赖于设备的受信任证书存储,而不是直接在代码库中固定证书。 这种方法提供了灵活性和恢复能力,以应对未来根证书的变化。

下表总结了哪些 SDK 版本支持受信任证书存储:

Azure IoT 设备 SDK 支持的版本
C 当前所有支持的版本
C# 当前所有支持的版本
Java 版本 2.x.x 及更高版本
Node.js 当前所有支持的版本
Python 当前所有支持的版本

证书固定

建议不要固定证书,也不要筛选 TLS 服务器证书(又名“叶证书”)和与 DPS 终结点关联的中间证书,因为 Microsoft 会经常滚动更新这些证书,但很少或没有通知。 如果必须固定证书,请仅固定根证书。

在 IoT SDK 中使用 TLS 1.2

使用以下链接在 Azure 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 或更高版本 链接

将 TLS 1.2 与 IoT 中心配合使用

IoT 中心可以配置为在与设备通信时使用 TLS 1.2。 有关详细信息,请参阅 IoT 中心弃用 TLS 1.0 和 1.1

将 TLS 1.2 与 IoT Edge 配合使用

IoT Edge 设备可以配置为在与 IoT 中心和 DPS 通信时使用 TLS 1.2。 有关详细信息,请参阅 IoT Edge 文档页