3、密码学基础(下):公钥基础设施(PKI)、证书链、根证书与中间证书
好,咱们接着聊密码学。上一节我们把非对称加密、哈希、数字签名这些基础概念捋了一遍。这一节,咱们要聊一个更贴近实战的东西——公钥基础设施(PKI)。
说白了,PKI 就是一套让「公钥」变得可信的规则和工具。你想想看,你拿到一个公钥,怎么知道它真的是对方发的?中间有没有被人调包?这就是 PKI 要解决的问题。
3.1 什么是 PKI?
PKI 不是某个具体的算法,而是一整套体系。它包括:
- 证书颁发机构(CA):负责签发和管理数字证书的机构。
- 注册机构(RA):负责验证申请者身份的辅助机构。
- 证书库:存储已签发证书和吊销列表(CRL)的地方。
- 终端实体:持有证书的个人或设备。
我刚开始接触固件签名时,觉得 PKI 离嵌入式很远。后来发现,没有 PKI,固件更新就是裸奔。你签了名,但公钥怎么安全地烧到芯片里?这就是 PKI 的活儿。
核心思想:PKI 通过数字证书将公钥与实体身份绑定,再由可信的第三方(CA)来担保这个绑定的真实性。
3.2 数字证书长什么样?
数字证书就是一张「电子身份证」。最常用的是 X.509 标准。我习惯把它拆成三部分看:
| 字段 | 说明 | 我的关注点 |
|---|---|---|
| 版本号 | V1、V2、V3 | 现在基本都用 V3,支持扩展 |
| 序列号 | CA 分配的唯一编号 | 吊销时靠它定位 |
| 签名算法 | 如 SHA256-RSA | 必须和固件签名算法一致 |
| 颁发者 | 签发该证书的 CA 名称 | 链式验证时一级级往上找 |
| 有效期 | 起止时间 | 过期证书直接拒掉 |
| 主体 | 证书持有者信息 | 设备 ID、厂商名等 |
| 公钥 | 持有者的公钥 | 验签时用的就是这个 |
| 扩展 | 密钥用途、基本约束等 | 这里坑很多,后面细说 |
嗯,这里要注意:扩展字段里的「基本约束」,决定了这个证书能不能继续签发下级证书。我见过有人把终端证书配成了 CA 证书,结果设备能给自己签发证书,安全防线直接破防。
3.3 证书链:信任是怎么传递的?
你不可能让每个设备都内置所有公钥。那怎么办?用证书链。
证书链的结构很简单:
- 根证书:自签名的,信任的锚点。它自己证明自己。
- 中间证书:由根证书签发,用来签发终端证书。
- 终端证书:由中间证书签发,直接给设备用。
验证过程是这样的:
- 用根证书的公钥,验证中间证书的签名。
- 用中间证书的公钥,验证终端证书的签名。
- 用终端证书的公钥,验证固件的签名。
说白了,就是一级一级往上信任。只要根证书是可信的,整条链就都可信。
我的经验:在嵌入式设备里,我通常只烧录根证书的哈希值,或者直接烧录根证书本身。中间证书和终端证书可以在固件更新时一起下发。这样既安全又灵活。
3.4 根证书与中间证书:谁更重要?
都重要,但角色不同。
根证书是信任的基石。它一旦泄露,整个体系就完了。所以根证书的私钥通常离线保存,放在硬件安全模块(HSM)里,甚至锁在保险柜里。我参与的一个项目,根证书私钥由三位高管分别保管密码,每次使用需要三人同时在场。
中间证书是日常使用的。它由根证书签发,但私钥可以放在在线服务器上。万一中间证书的私钥泄露,只需要吊销它,再用根证书签发一个新的中间证书就行。根证书纹丝不动。
注意:千万不要把根证书的私钥放在任何联网的设备上。我曾经见过一个厂商,把根证书私钥放在 CI 服务器上,结果被拖库,所有设备都得召回。那成本,啧啧。
3.5 证书链验证的常见坑
我踩过的坑,列出来给你参考:
- 证书过期:设备时钟不准,导致证书验证失败。解决办法是用固件时间戳,或者用 NTP 同步。
- 证书吊销:证书被吊销了,但设备没有 CRL 或 OCSP 响应器,依然信任它。我建议至少支持 CRL,定期更新。
- 链不完整:设备只收到了终端证书,没有中间证书。验证时找不到上级,直接失败。所以固件包里要包含完整的证书链。
- 密钥用途不对:证书的扩展字段限制了用途。比如一个证书只允许用于签名,你却用它来做密钥交换,那验证就会失败。
3.6 一张图看懂 PKI 证书链
下面这张 SVG 图,展示了从根证书到固件签名的完整信任链。我画的时候特意把「信任锚」标红了,因为这是整个体系的命门。
3.7 实战建议:怎么在固件里用 PKI?
我个人的习惯是这样的:
- 预置根证书:在芯片出厂时,把根证书(或它的哈希)烧进一次性可编程存储器(OTP)里。这样谁也改不了。
- 固件包携带证书链:每次固件更新,都把中间证书和终端证书一起发下去。设备先验证链,再验签名。
- 支持证书吊销:至少实现一个简单的 CRL 检查。如果证书被吊销,直接拒绝更新。
- 注意有效期:设备时钟不准时,用固件里的时间戳代替。或者干脆让证书有效期长一点,比如 10 年。
一句话总结:PKI 就是一套让信任可以传递的机制。根证书是锚,中间证书是桥,终端证书是钥匙。三者缺一不可。
好了,这一节就到这里。记住,证书链验证是固件安全的第一道防线。下一节我们聊聊具体的签名算法和实现细节。