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 依然安全。
签发流程大致如下:
- 设备生成密钥对:在设备安全元件(SE)或 TPM 内生成,私钥永不出芯片。
- 设备提交 CSR:证书签名请求包含公钥和设备身份信息(如序列号、厂商 ID)。
- RA 审核身份:验证设备是否属于合法批次,是否在允许列表中。
- CA 签发证书:用签发 CA 的私钥对 CSR 签名,生成 X.509 证书。
- 证书注入设备:通过安全通道写入设备安全存储区。
避坑指南:我曾经遇到一个项目,设备 CSR 中的公钥是在主机 CPU 上生成的,然后才导入 SE。这导致私钥在内存中短暂暴露,被调试接口抓取。正确的做法是:密钥生成和 CSR 生成必须在安全芯片内完成。
4.3 证书链验证机制
设备向服务器发起连接时,服务器需要验证设备证书是否可信。验证过程不是只看证书本身,而是要验证整条证书链。
举个例子,设备证书由「中间 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 证书,设备还是得把整条链发过去。我建议在系统设计阶段就明确「信任锚」的位置。