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

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 密钥的服务器证书。过去,证书都源自巴尔的摩网络信任根 CA。 由于巴尔的摩根位于生命周期末,因此我们正在迁移到名为 DigiCert Global G2 的新根。 此迁移会影响当前连接到IoT 中心的所有设备。 有关详细信息,请参阅 IoT TLS 证书更新

尽管根 CA 迁移很少见,但为了在现代安全环境中复原,应为不太可能泄露根 CA 或需要紧急根 CA 迁移准备 IoT 方案。 强烈建议所有设备信任以下三个根 CA:

  • Baltimore CyberTrust 根 CA
  • DigiCert Global G2 根 CA
  • Microsoft RSA 根 CA 2017

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

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

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

强烈建议所有使用 ECC 的设备都信任以下两个根 CA:

  • DigiCert Global G3 根 CA
  • Microsoft RSA 根 CA 2017

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

预览 IoT 中心的 ECC 服务器证书:

  1. 在启用预览模式的情况下创建新的 IoT 中心
  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 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 中心时,才会显示此设置。

    Screenshot showing how to turn on TLS 1.2 enforcement during IoT hub creation

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

设备身份验证

成功进行 TLS 握手后,IoT 中心可以使用对称密钥或 X.509 证书对设备进行身份验证。 对于基于证书的身份验证,可以使用任何 X.509 证书,包括 ECC。 IoT 中心根据所提供的指纹或证书颁发机构 (CA) 对证书进行验证。 若要了解详细信息,请参阅支持的 X.509 证书

相互 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 中心终结点关联的中间证书,因为 Microsoft 经常滚动更新这些证书,但很少或没有通知。 如果必须执行相关操作,请仅按照此 Azure IoT 博客文章中所述固定根证书。

TLS 最大片段长度协商(预览)

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

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

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

  1. 在启用预览模式的情况下创建新的 IoT 中心
  2. 使用 OpenSSL 时,请调用 SSL_CTX_set_tlsext_max_fragment_length 以指定片段大小。
  3. 将客户端连接到预览版 IoT 中心。

后续步骤