4. 公钥基础设施(PKI)与设备证书:PKI基础概念、设备证书的签发与吊销、证书链验证机制

聊到设备身份绑定,PKI 是绕不开的核心基础设施。说白了,PKI 就是一套为数字世界发「身份证」的体系。我刚开始接触物联网安全时,觉得 PKI 就是 CA 发证书,后来踩了坑才明白——证书的签发、验证、吊销,每一个环节都可能成为安全短板。

4.1 PKI 基础概念

PKI 不是单一技术,而是一套完整的框架。它包含三个核心角色:

  • 证书颁发机构(CA):负责签发和吊销证书,是信任的根。
  • 注册机构(RA):负责验证申请者身份,把审核结果交给 CA。
  • 证书持有者:设备或用户,持有公私钥对和证书。

我习惯把 PKI 比作「户籍系统」:CA 是公安局,RA 是派出所,证书就是身份证。设备出厂时拿到证书,就像新生儿上户口。但物联网设备数量巨大,很多厂商图省事,所有设备共用同一个证书——这相当于整栋楼的人共用一张身份证,安全风险可想而知。

核心原则:PKI 的信任基础是「链式信任」。每个证书都依赖上一级证书的签名,最终追溯到自签名的根 CA 证书。只要根 CA 可信,整条链就可信。

4.2 设备证书的签发流程

设备证书的签发,我建议采用离线根 CA + 在线签发 CA 的架构。根 CA 物理隔离,签发 CA 负责日常发证。这样即使签发 CA 被攻破,根 CA 依然安全。

签发流程大致如下:

  1. 设备生成密钥对:在设备安全元件(SE)或 TPM 内生成,私钥永不出芯片。
  2. 设备提交 CSR:证书签名请求包含公钥和设备身份信息(如序列号、厂商 ID)。
  3. RA 审核身份:验证设备是否属于合法批次,是否在允许列表中。
  4. CA 签发证书:用签发 CA 的私钥对 CSR 签名,生成 X.509 证书。
  5. 证书注入设备:通过安全通道写入设备安全存储区。

避坑指南:我曾经遇到一个项目,设备 CSR 中的公钥是在主机 CPU 上生成的,然后才导入 SE。这导致私钥在内存中短暂暴露,被调试接口抓取。正确的做法是:密钥生成和 CSR 生成必须在安全芯片内完成。

4.3 证书链验证机制

设备向服务器发起连接时,服务器需要验证设备证书是否可信。验证过程不是只看证书本身,而是要验证整条证书链。

举个例子,设备证书由「中间 CA」签发,中间 CA 由「根 CA」签发。验证时:

  • 服务器用根 CA 的公钥验证中间 CA 证书的签名
  • 再用中间 CA 的公钥验证设备证书的签名
  • 同时检查每个证书的有效期、吊销状态、密钥用法

为什么会这么设计?你想想看,如果直接让根 CA 签发所有设备证书,根 CA 的私钥一旦泄露,整个体系就崩了。分层设计可以缩小影响范围——即使某个中间 CA 出问题,只需要吊销它的证书,其他分支不受影响。

证书链验证流程 根 CA 证书(自签名) 中间 CA 证书 设备证书 验证步骤: ① 用根 CA 公钥验证中间 CA 证书签名 → ② 用中间 CA 公钥验证设备证书签名 ③ 检查各证书有效期、吊销状态、密钥用法 → ④ 确认信任链完整

4.4 证书吊销机制

证书不是永久的。设备被破解、私钥泄露、设备退役,都需要吊销证书。常用的吊销方式有两种:

机制 原理 适用场景 缺点
CRL(证书吊销列表) CA 定期发布已吊销证书的序列号列表 离线环境、内网设备 列表可能很大,实时性差
OCSP(在线证书状态协议) 实时查询单个证书的吊销状态 互联网设备、高频验证 依赖网络,OCSP 响应器可能成为瓶颈

注意:物联网设备很多处于离线或弱网环境,OCSP 可能不可用。我建议采用短有效期证书 + 本地 CRL 缓存的方案。证书有效期设为 7 天,即使 CRL 更新延迟,泄露的证书也只能在短时间内被滥用。

4.5 设备证书的实践要点

在实际项目中,设备证书的签发和管理有几个关键点:

  • 证书模板定制:X.509 证书的扩展字段可以携带设备属性,如固件版本、硬件 ID。我在项目中用 SubjectAltName 字段存储设备 MAC 地址,方便服务器快速关联。
  • 密钥保护等级:消费级设备用软件 TEE 即可,工业设备必须用独立安全芯片。成本和安全要平衡。
  • 证书轮换策略:设备在生命周期内可能需要换发证书。我建议在固件中预置「证书更新请求」逻辑,设备在证书到期前主动发起换发。

个人经验:有一次客户要求所有设备证书有效期设为 10 年。我坚决反对——时间越长,私钥泄露的风险越大。最终折中方案是:根 CA 证书 20 年,中间 CA 证书 5 年,设备证书 1 年。设备通过 OTA 更新证书,既保证安全,又降低运维成本。

4.6 证书链的存储与传输优化

物联网设备资源有限,证书链可能占用不少空间。一条完整的证书链(根 CA + 中间 CA + 设备证书)可能达到 3-5 KB。对于只有几百 KB Flash 的 MCU,这不可忽视。

我常用的优化手段:

  • 裁剪证书链:设备只存储中间 CA 和设备证书,根 CA 证书预置在服务器端。设备发送证书时只发设备证书,服务器自行补全链。
  • 证书压缩:使用 DER 格式而非 PEM,减少约 30% 体积。
  • 缓存验证结果:服务器缓存设备证书的验证结果,避免每次连接都做完整链验证。

嗯,这里要注意:裁剪证书链的前提是服务器必须信任该中间 CA。如果服务器没有预置中间 CA 证书,设备还是得把整条链发过去。我建议在系统设计阶段就明确「信任锚」的位置。