跳到主要内容

证书身份

设备可以用客户端证书而不是令牌或密码来证明自己的身份。它在 MQTT 连接的 TLS 握手中出示证书,平台检查该证书是否由租户信任的证书颁发机构(CA)签发。固件里不需要烧录任何共享机密,也没有任何东西可以被人从网络上复制一条消息后重放:私钥从不离开设备。

本页说明平台如何决定信任一张证书,以及这种信任到哪里为止。要进行设置,请按使用证书连接设备操作;控制台一侧见 预配置与信任锚。要运维消息代理并进行监控,见证书认证。

状态

在平台消息代理上的 MQTT 中可用。HTTP 和 LwM2M 不接受客户端证书,C# SDK 目前还不能出示客户端证书,证书的自动续期也尚未提供。不支持的内容列出了所有未覆盖的部分。

信任锚是身份的边界​

**信任锚(trust anchor)**是租户添加的一张 CA 证书,意思是“持有该 CA 所签发证书的设备都是我的设备”。它是公开材料,按原样保存。每个租户最多可以有 32 个。

  • 根 CA 或中间 CA 都可以作为信任锚。请锚定在只签发你自己设备的最窄的 CA 上。如果制造商为许多客户运营同一套 PKI,请信任签发你设备群的子 CA,而不是根 CA。
  • 每次连接都会重新对照信任锚检查。证书的任何内容都不会被缓存为“已信任”。
  • 信任锚可以被禁用。这会立即撤销该 CA,并结束所有依赖它的设备的现有会话。

由于信任锚决定谁是该租户的设备,不遵循名称约束(name constraints)。带有名称约束的 CA,在作为信任锚添加时,或出现在设备出示的证书链中时,都会被拒绝。DeviceChain 使用的身份是证书的通用名称(common name),而名称约束并不覆盖它。本来用于限制 CA 可签发范围的约束会被悄悄忽略,所以平台选择拒绝该证书,而不是让你误以为它生效了。

证书必须满足什么​

只有同时满足以下全部条件,平台才接受设备证书:

  • 在扩展密钥用途中声明了客户端认证。没有扩展密钥用途,或允许任意用途的证书会被拒绝:它从未声称自己是客户端证书。
  • 它本身不是 CA。
  • 它以及它之上的任何证书都没有使用 SHA-1 签名。
  • 证书链中的每个密钥都是 2,048 至 8,192 位的 RSA、P-256 或 P-384 的 ECDSA,或 Ed25519。
  • 它的证书链(从叶子证书到设备发送的中间证书)能够构建到信任锚。设备最多发送五张证书,总共不超过 16 KiB。
  • 当前有效。最多提前五分钟签发的证书也会被接受,以容忍时钟比 CA 略慢的设备;其到期时间绝不会被延长。

证书成为设备的两种方式​

方式你要做什么设备的身份
固定凭据(pinned credential)先创建设备,再添加一个 X509_CERTIFICATE 凭据,写入它的证书并指明信任锚。你创建的那台设备。令牌由你选择。
首次连接时注册创建证书配置(certificate profile):一个指明信任锚的自动注册配置。证书链到该信任锚的设备在首次连接时自行注册。为该证书创建的设备。外部 ID 是证书的通用名称,令牌由它派生。

固定凭据由证书的 SHA-256 标识,由服务器计算。凭据记录证书必须链到的信任锚,以及整条证书链上最早的到期时间。一台设备最多可同时持有三个有效的证书凭据,因此可以在旧证书到期前先加入替换者。

证书配置没有需要保管或轮换的注册密文,因为证书本身就是证明。它使用与自注册相同的控制手段:策略、设备数量上限、到期时间,以及撤销它所注册的设备。每个租户最多可以有八个证书配置。

派生令牌与客户端 ID​

MQTT 会话以客户端 ID 为键,平台要求客户端 ID 为 {instanceId}:{tenant}:{deviceToken},这样一台设备就无法接管另一台设备的会话。首次连接时注册的设备还没有令牌,所以平台需要一个仅凭证书就能算出的令牌,并且在写入任何数据之前完成计算。由证书注册的设备,其令牌为:

pv-{slug}-{hash}
  • slug 是通用名称中除字母、数字、- 和 _ 之外的每个字符都替换为 -,并去掉首尾的 - 和 _。
  • hash 是通用名称的 SHA-256 的前 12 个十六进制字符。
  • 整个令牌最长 128 个字符;过长的 slug 会被截短以适应。

因此设备固件可以根据自己的证书算出自己的客户端 ID。指南中有一个完整示例。客户端 ID 不匹配的连接会在创建任何内容之前被拒绝,所以被拒绝的连接绝不会留下半成品设备。

事先创建并预指定给某个证书配置的设备必须使用这个令牌。令牌留空时,控制台和 API 会自动填入,填入不同的值则被拒绝。

由哪个配置注册设备​

一张证书可能链到多个配置的信任锚。其信任锚离证书最近的配置胜出,因此锚定在中间 CA 的配置优先于锚定在其根 CA 的配置。如果两个可用配置距离相同,连接会被拒绝而不是随意猜测,并触发告警 DeviceX509JitMisconfigured。请给每个配置各自的信任锚,或把其中一个锚定在更窄的 CA 上。

首次连接时注册在策略 ALLOW_NEW 下创建设备。在 ALLOW_NEW 下,该信任锚的 CA 签发的、通用名称尚无设备使用过的任何证书,都会注册一台新设备,直到达到配置的 maxDevices。如果这样过于开放,请锚定在最窄的中间 CA 上、设置上限,并在发生泄露时禁用信任锚。采用(adopt)你事先创建并预指定的设备,以及为已持有证书的设备接受续期后的新证书,目前都尚未提供。

会话持续多久​

会话的有效期到设备证书、每张中间证书和信任锚(以及凭据自己的到期时间,如果有)三者中最早的 notAfter 为止。消息代理在那一刻关闭会话。续期了证书的设备用新证书重新连接。

撤销​

你需要做法生效时间
停用一台设备禁用或删除它的 X509_CERTIFICATE 凭据,或禁用该设备立即;打开的会话被结束
停用整个 CA禁用信任锚立即;所有依赖它的设备的会话被结束
停用自行注册的设备revokeProvisionedDevices 或 resetDeviceProvisioning,与任何自注册设备相同立即
让证书自然失效签发短期证书恰好在证书到期时
停用一张从未连接过的被盗证书事先创建设备并固定其证书,或禁用信任锚在其中一件事发生之前不会生效

没有 CRL,也没有 OCSP。 平台不获取也不上传吊销列表,也不会向响应方询问证书是否仍然有效。想停用一张证书,就禁用它的凭据或它的信任锚。请据此规划:从你的 CA 签发短期证书并依靠到期失效,把禁用凭据和信任锚作为立即生效的手段。

不支持的内容​

  • 名称约束。 带名称约束的 CA 会被拒绝,如上所述。
  • 证书吊销列表(CRL)与 OCSP。 见撤销。
  • 自动续期,以及在重置注册后重新采用设备。 已持有一张证书的设备再出示另一张不同的证书时,在连接注册时会被拒绝(ALREADY_PROVISIONED)。在续期功能推出之前,请在旧证书到期前把新证书添加为固定凭据(一台设备可持有三个)。
  • C# SDK。 目前还不能出示客户端证书。
  • HTTP 摄取与 LwM2M。 两者都不使用客户端证书认证。HTTP 设备使用令牌或基本凭据,LwM2M 设备使用预共享密钥。在 MQTT 上,如果用户名不是 {tenant}:@x509,出示的证书会被忽略,连接仍按其令牌或密码判断,与以前一样。
  • 其他消息代理。 只有平台自己的消息代理支持证书认证。通过运维方自有外部消息代理连接的设备不在覆盖范围内。
  • 由平台签发的证书。 CA 和证书都由你自己提供。