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

IoT 中心的传输层安全性 (TLS) 支持

IoT 中心使用传输层安全性 (TLS) 保护来自 IoT 设备和服务的连接。

注意

根据有关 TLS 1.0 和 1.1 停用的 Azure 范围的服务公告,Azure IoT 中心将于 2025 年 8 月 31 日终止对 TLS 1.0 和 1.1 的支持。

因此,必须事先正确测试并验证你的所有 IoT 设备和服务是否与 TLS 1.2 和建议的密码兼容。 强烈建议使用最低 TLS 强制功能作为测试和合规机制

若要了解 IoT 中心设备正在运行的 TLS 版本,请参阅 TLS 1.0 和 1.1 终止支持指南

相互 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 中心可以使用对称密钥或 X.509 证书对设备进行身份验证。 对于基于证书的身份验证,IoT 中心会根据你提供的指纹或证书颁发机构 (CA) 对证书进行验证。 若要了解详细信息,请参阅支持的 X.509 证书

IoT 中心的服务器 TLS 证书

在 TLS 握手期间,IoT 中心会提供 RSA 加密的服务器证书以连接客户端。 全局 Azure 云中的所有 IoT 中心均使用由 DigiCert Global Root G2 颁发的 TLS 证书。

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

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

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

根 CA 迁移很少见。 你应该始终为根 CA 被泄露和需要紧急根 CA 迁移的不太可能的情况准备 IoT 解决方案。

密码套件

为了遵守 Azure 的安全连接安全策略,IoT 中心支持以下适用于 TLS 1.2 的 RSA 和 ECDSA 密码套件:

  • 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
  • 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

IoT 中心目前允许使用以下密码套件。 但是,Azure 安全准则不再推荐这些密码套件。

密码套件 TLS 版本支持
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS 1.2
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 TLS 1.2
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 TLS 1.2
TLS_RSA_WITH_AES_256_GCM_SHA384 TLS 1.2
TLS_RSA_WITH_AES_128_GCM_SHA256 TLS 1.2
TLS_RSA_WITH_AES_256_CBC_SHA256 TLS 1.2
TLS_RSA_WITH_AES_128_CBC_SHA256 TLS 1.2
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS 1.0/1.1/1.2
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA TLS 1.0/1.1/1.2
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA TLS 1.0/1.1/1.2
TLS_RSA_WITH_3DES_EDE_CBC_SHA TLS 1.0/1.1/1.2
TLS_RSA_WITH_3DES_EDE_CBC_SHA TLS 1.0/1.1/1.2
TLS_RSA_WITH_AES_128_CBC_SHA TLS 1.0/1.1/1.2
TLS_RSA_WITH_AES_256_CBC_SHA TLS 1.0/1.1/1.2

客户端可以建议在 ClientHello 期间使用的高级密码套件的列表。 但是,IoT 中心可能不支持其中某些密码套件(例如 ECDHE-ECDSA-AES256-GCM-SHA384)。 在这种情况下,IoT 中心将尝试遵循客户端的偏好,但最终会通过 ServerHello 协商密码套件。

强制 IoT 中心使用 TLS 1.2 和强密码套件

为了确保 IoT 设备符合 TLS 1.2 和强密码套件的要求,可以使用 Azure IoT 中心的最低 TLS 强制功能来强制实施合规性。

目前此功能仅在以下区域提供,在创建 IoT 中心期间可用(将于 2025 年支持其他 Azure 区域):

  • 美国东部
  • 美国中南部
  • 美国西部 2
  • US Gov 亚利桑那州
  • US Gov 弗吉尼亚州(此区域不支持 TLS 1.0/1.1 - 必须启用 TLS 1.2 强制执行,否则 IoT 中心创建会失败)

若要在 Azure 门户中启用 TLS 1.2 和强密码套件强制,请执行以下操作:

  1. 开始在 Azure 门户中使用 IoT 中心创建向导

  2. 从上面的列表中选择一个“区域”。

  3. 在“管理”->“高级”->“传输层安全性 (TLS)”->“最低 TLS 版本”下,选择“1.2”。 仅在受支持的区域中创建 IoT 中心时,才会显示此设置。

    屏幕截图显示如何在创建 IoT 中心期间启用 TLS 1.2 强制。

  4. 单击“创建”

  5. 将 IoT 设备连接到此 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 属性在异地配对区域中仍然有效。

检查 IoT 中心设备的 TLS 版本

Azure IoT 中心可以提供多种类别的诊断日志,这些诊断日志可以使用 Azure Monitor 日志进行分析。 在连接日志中,可以找到 IoT 中心设备的 TLS 版本。

要查看这些日志,请执行以下步骤:

  1. Azure 门户中,转到 IoT 中心。
  2. 在资源菜单中的“监视”下,选择“诊断设置”。 确保诊断设置已选中“连接”。
  3. 在资源菜单中的“监视”下,选择“日志”
  4. 输入以下查询:
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
| where Category == "Connections"
| where OperationName == "deviceConnect"
| extend props_json = parse_json(properties_s)
| project DeviceId = props_json.deviceId, TLSVersion = props_json.tlsVersion
  1. 查询结果示例如下:此图显示设备 TLS 版本查询。
  2. 注意:TLS 版本查询不适用于使用 HTTPS 连接的设备。

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 设备可以配置为在与 IoT 中心通信时使用 TLS 1.2。 为此,请参阅 IoT Edge 文档页

椭圆曲线加密 (ECC) 服务器 TLS 证书

在为 RSA 证书提供相似安全性的同时,ECC 证书验证(具有仅限 ECC 的加密套件)最多使用 40% 的计算、内存和带宽。 由于 IoT 设备的配置文件和内存较少,因此这些节省的资源对于 IoT 设备而言至关重要,并且对于支持网络带宽受限的环境中的用例也至关重要。

若要使用 IoT 中心的 ECC 服务器证书,请执行以下操作:

  1. 确保所有设备信任以下根 CA:
    • DigiCert Global G2 根 CA
    • Microsoft RSA root CA 2017
  2. 对客户端进行配置,使其仅包含 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
  3. 将客户端连接到 IoT 中心。

TLS 最大片段长度协商

IoT 中心还支持 TLS 最大片段长度协商,有时也称为 TLS 片段大小协商。 此功能目前以公共预览版提供。

使用此功能可将最大纯文本片段长度指定为小于默认 2^14 字节的值。 协商后,IoT 中心和客户端开始对消息进行分段,以确保所有片段都小于协商的长度。 此行为对计算或内存受限的设备很有用。 若要了解详细信息,请参阅官方 TLS 扩展规范

尚未提供对此公共预览版功能的官方 SDK 支持。 入门指南

  1. 创建 IoT 中心。
  2. 使用 OpenSSL 时,请调用 SSL_CTX_set_tlsext_max_fragment_length 以指定片段大小。
  3. 将客户端连接到 IoT 中心。

证书固定

强烈建议不要进行证书固定,不要筛选 TLS 服务器证书,不要使用与 IoT 中心终结点关联的中间证书,因为 Microsoft 经常滚动更新这些证书,但很少进行通知,或者根本就不进行通知。 如果必须执行相关操作,请仅按照此 Azure IoT 博客文章中所述固定根证书。

后续步骤