4. 密码学基础(下):公钥基础设施(PKI)、证书链、根证书与设备证书
上一讲我们聊了对称与非对称加密、哈希和签名这些“砖块”。这一讲,咱们得把这些砖块砌成一面能用的墙——也就是公钥基础设施(PKI)。
说白了,PKI 就是一套管理公钥的规则和工具。你想想看,非对称加密里公钥是公开的,但你怎么确定你手里的公钥真的是张三的,而不是李四伪造的?PKI 就是来解决这个信任问题的。
核心观点: 密码学算法解决的是“能不能加解密”的问题,而 PKI 解决的是“该信谁”的问题。在 OTA 场景里,后者往往更致命。
4.1 数字证书:公钥的“身份证”
数字证书,就是把一个公钥和它的所有者绑定在一起。这个绑定不是随便说说的,而是由一个大家都信任的第三方——证书颁发机构(CA)——来担保的。
一个标准的 X.509 数字证书包含哪些东西?我列个表给你看:
| 字段 | 说明 | OTA 中的意义 |
|---|---|---|
| 版本号 | X.509 版本(通常是 v3) | 决定证书支持哪些扩展 |
| 序列号 | CA 分配的唯一编号 | 用于吊销时标识证书 |
| 签名算法 | CA 签名时用的算法(如 SHA256-RSA) | 验证签名时必须一致 |
| 颁发者 | 签发该证书的 CA 名称 | 构建证书链的关键 |
| 有效期 | 起始和结束时间 | 设备需要检查证书是否过期 |
| 主体 | 证书持有者的名称 | 标识设备或服务器身份 |
| 公钥 | 持有者的公钥信息 | 用于验证签名或加密 |
| 扩展 | 密钥用途、基本约束等 | 限制证书的使用范围 |
| CA 签名 | CA 用私钥对整个证书的签名 | 确保证书未被篡改 |
嗯,这里要注意:证书本身就是一个被签名的数据结构。你拿到一个证书,只要用 CA 的公钥验证一下上面的签名,就知道这个证书是不是真的了。
4.2 证书链:信任的传递
你可能会问:CA 的公钥又是哪来的?总不能无限递归下去吧?
没错,所以就有了证书链(Certificate Chain)的概念。它像一个金字塔:
- 根证书(Root CA): 最顶层的 CA,它的公钥是“自签名”的——自己给自己签名。这个证书通常预置在设备或操作系统里,作为信任的锚点。
- 中间证书(Intermediate CA): 由根 CA 签发,用来分担签发压力。根 CA 的私钥通常离线保存,很少直接使用。
- 设备证书(End-Entity Certificate): 由中间 CA 签发,直接绑定到具体的设备或服务器。
验证的时候,从设备证书开始,逐级向上验证,直到信任的根证书。这个过程就叫证书链验证。
我的经验: 在嵌入式设备里,我建议只预置根证书,不要预置中间证书。中间证书通过 OTA 更新下发,这样根证书私钥泄露的风险就小多了。我曾经见过一个项目,把所有证书都写死在固件里,结果根证书要更换时,整批设备都得返厂……那叫一个惨。
4.3 根证书:信任的锚点
根证书是整个 PKI 体系的基石。它为什么特殊?因为它没有上级,自己证明自己。
在嵌入式 OTA 场景里,根证书通常是在设备出厂时烧录进去的。一旦烧进去,就不能轻易改了。所以根证书的管理要格外小心:
- 私钥保护: 根 CA 的私钥必须离线保存,最好放在硬件安全模块(HSM)里。
- 密钥长度: 我建议至少用 4096 位 RSA 或 P-384 椭圆曲线。设备证书可以用短一点的密钥,但根证书要足够强壮。
- 有效期: 根证书的有效期通常很长(10-20 年),但设备证书可能只有 1-2 年。
避坑指南: 我曾经遇到一个客户,根证书用的是 1024 位 RSA。当时觉得够用,结果三年后就被破解了。整个产品线的设备都得远程更新根证书——还好我们设计了 OTA 更新机制,不然就成砖了。所以,根证书的强度一定要有前瞻性。
4.4 设备证书:设备的身份标识
每个设备在出厂前,都应该申请一个唯一的设备证书。这个证书绑定了设备的公钥和它的身份信息(比如设备 ID、型号、批次等)。
在 OTA 更新中,设备证书的作用有两个:
- 身份认证: 服务器验证设备证书,确认设备是合法的,不是冒牌货。
- 签名验证: 设备用私钥对请求签名,服务器用设备证书里的公钥验证。
设备证书的私钥必须安全存储。在嵌入式设备里,我强烈建议使用安全元件(Secure Element)或 TEE(可信执行环境)来保护私钥。如果私钥被提取出来,攻击者就可以伪造设备身份了。
4.5 证书生命周期管理
证书不是永久的,它有自己的生命周期。在 OTA 系统里,你需要考虑:
| 阶段 | 操作 | 注意事项 |
|---|---|---|
| 颁发 | 设备生产时生成密钥对,CSR 提交给 CA | 确保每个设备密钥唯一 |
| 部署 | 将设备证书和根证书烧录到设备 | 根证书要防篡改 |
| 使用 | 设备用证书进行身份认证和签名 | 定期检查有效期 |
| 更新 | 证书即将过期时,通过 OTA 下发新证书 | 新旧证书要有重叠期 |
| 吊销 | 设备被入侵或证书泄露时,吊销证书 | 需要 CRL 或 OCSP 支持 |
这里有个关键点:证书更新必须通过安全通道进行。你不能让攻击者截获证书更新包,然后替换成自己的证书。所以,证书更新本身也要签名验证。
4.6 PKI 在 OTA 中的完整流程
说了这么多,咱们用一张图把整个流程串起来:
你看,验证方向跟签发方向是反的。从设备证书开始,一路向上验证,直到碰到设备里预置的根证书。只要有一环验证失败,整个信任链就断了,更新包就会被拒绝。
4.7 嵌入式环境下的 PKI 优化
嵌入式设备资源有限,不能像 PC 服务器那样搞一套完整的 PKI。我分享几个实战中的优化点:
- 证书裁剪: 去掉不必要的扩展字段,减少证书大小。一个标准的 X.509 证书可能 1-2KB,但嵌入式设备里可以压缩到 500 字节以内。
- 预置根证书: 只预置根证书,中间证书和设备证书通过 OTA 下发。这样根证书不用频繁更新。
- 证书固定(Certificate Pinning): 在设备里直接固定根证书的哈希值,而不是存整个证书。验证时比对哈希,省去证书解析的开销。
- 批量验证: 如果设备数量巨大,可以考虑用批量签名方案(如 Merkle 树),减少单个设备的证书管理成本。
我的习惯: 在资源受限的 MCU 上,我通常只用 ECDSA 签名,不用 RSA。ECDSA 的签名短(64 字节 vs 256 字节),计算也快。而且椭圆曲线密钥可以更短(256 位 ECC 相当于 3072 位 RSA 的安全性)。
4.8 常见陷阱与避坑
最后,我总结几个 PKI 在 OTA 中容易踩的坑:
- 时间不同步: 证书验证需要检查有效期。如果设备时间不准,可能导致证书“过期”或“未生效”。我建议用 NTP 同步时间,或者干脆不检查有效期(只检查签名)。
- 证书吊销不及时: 设备被入侵后,证书应该立即吊销。但嵌入式设备可能无法实时访问 CRL 或 OCSP。折中方案是:在 OTA 更新包中附带最新的吊销列表。
- 根证书泄露: 这是最严重的。一旦根证书私钥泄露,整个 PKI 体系就崩塌了。所以根证书私钥一定要离线保存,最好用 HSM。
- 证书链过长: 证书链每多一级,验证就多一次签名计算。在嵌入式设备里,我建议最多三级(根 CA -> 中间 CA -> 设备证书)。
嗯,PKI 的内容就讲到这里。它不像算法那样有炫酷的数学公式,但它是整个 OTA 安全体系的骨架。骨架歪了,再好的算法也白搭。