3、公钥基础设施(PKI):CA证书体系、X.509证书结构、证书链验证流程、自签名证书的生成
公钥基础设施,简称 PKI。说白了,它就是一套让数字世界互相信任的规则和工具。你想想看,固件签名后,设备凭什么相信这个签名是合法的?凭的就是 PKI 这套体系。我在嵌入式安全领域摸爬滚打这些年,可以负责任地告诉你:不理解 PKI,就别谈固件安全。
3.1 CA证书体系:谁来做信任的裁判?
CA,全称 Certificate Authority,证书颁发机构。它是 PKI 体系里的核心角色,负责签发和管理数字证书。CA 体系通常分为三层:
- 根CA(Root CA):整个信任链的起点。它自己给自己签名,叫自签名证书。根CA的私钥必须离线保存,物理隔离。我见过不少公司把根CA私钥放在联网服务器上,嗯,那基本等于把家门钥匙挂在门外。
- 中间CA(Intermediate CA):由根CA签发,负责实际签发终端实体证书。这样做的好处是,即使中间CA出问题,根CA还能撤销它,不至于整个体系崩塌。
- 终端实体证书(End-Entity Certificate):最终发给设备、服务器或用户的证书。固件签名用的就是这类证书。
核心原则:信任不能传递,只能验证。根CA是信任锚点,所有信任都从这里开始。
3.2 X.509证书结构:一张身份证的解剖
X.509 是数字证书的国际标准格式。每个证书就像一张身份证,里面包含了很多字段。我挑几个最重要的说:
| 字段 | 说明 | 我的经验 |
|---|---|---|
| 版本号 | 目前主流是 V3 | V1/V2 已经很少见了,别用 |
| 序列号 | CA 分配给证书的唯一编号 | 撤销证书时靠它定位 |
| 签名算法 | 如 SHA256-RSA | 别用 SHA1,已经被攻破了 |
| 颁发者 | 签发该证书的 CA 名称 | 证书链验证时逐级比对 |
| 有效期 | 起始时间和结束时间 | 我曾经遇到设备因证书过期而拒绝启动,排查了一整天 |
| 主体 | 证书持有者的名称 | 固件签名证书通常写设备型号或厂商名 |
| 公钥 | 持有者的公钥信息 | 这是核心,签名验证全靠它 |
| 扩展 | V3 引入,如密钥用法、基本约束 | 固件签名证书必须设置 digitalSignature 用法 |
小技巧:用 OpenSSL 查看证书内容时,openssl x509 -in cert.pem -text -noout 这个命令我一天能用几十次。
3.3 证书链验证流程:信任是怎么传递的?
证书链验证,就是从一个终端证书开始,逐级向上追溯,直到找到信任的根CA证书。流程如下:
- 解析终端证书:读取颁发者字段,找到上一级证书。
- 验证签名:用上一级证书的公钥,验证当前证书的签名是否合法。
- 检查有效期:当前证书是否在有效期内。
- 检查撤销状态:通过 CRL 或 OCSP 确认证书未被撤销。
- 重复步骤1-4:直到遇到根CA证书(自签名证书)。
- 信任锚点检查:根CA证书是否在本地信任存储中。
为什么会这样设计?因为直接信任一个终端证书风险太大。如果某个中间CA被攻破,根CA可以撤销它,而不用重新部署所有设备。我曾经帮一家客户排查固件验证失败的问题,最后发现是证书链不完整——设备只存了终端证书,没有存中间CA证书。
避坑指南:设备端必须存储完整的证书链(根CA + 中间CA),否则验证会失败。我曾经见过厂商只存了根CA,结果中间CA一换,所有设备都变砖了。
3.4 自签名证书的生成:自己动手,丰衣足食
自签名证书,就是自己给自己签发的证书。在开发阶段、内部测试或小型项目中,自签名证书非常实用。生成自签名证书,我习惯用 OpenSSL,几行命令搞定:
# 生成私钥(2048位RSA)
openssl genrsa -out mykey.pem 2048
# 生成自签名证书(有效期10年)
openssl req -new -x509 -key mykey.pem -out mycert.pem -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=MyRootCA"
# 查看证书内容
openssl x509 -in mycert.pem -text -noout
这里有几个关键点:
- 私钥必须保密:自签名证书的私钥一旦泄露,任何人都可以冒充你。我曾经见过有人把私钥传到 GitHub 上,嗯,那画面太美我不敢看。
- 有效期别设太长:10年已经算长了。我建议开发证书设1-2年,生产证书设3-5年。
- Subject 信息要规范:CN(Common Name)是必填项,通常写域名或组织名。
避坑指南:自签名证书的浏览器信任问题。浏览器默认不信任自签名证书,访问 HTTPS 时会报安全警告。解决办法是把自签名证书导入操作系统的信任存储。我曾经在演示时忘了这步,结果现场翻车,观众看着大红叉一脸懵逼。
自签名证书虽然方便,但生产环境还是建议用正规CA签发的证书。为什么?因为自签名证书无法被撤销。如果私钥泄露,你只能手动更换所有设备上的证书,那工作量...你懂的。