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证书。流程如下:

  1. 解析终端证书:读取颁发者字段,找到上一级证书。
  2. 验证签名:用上一级证书的公钥,验证当前证书的签名是否合法。
  3. 检查有效期:当前证书是否在有效期内。
  4. 检查撤销状态:通过 CRL 或 OCSP 确认证书未被撤销。
  5. 重复步骤1-4:直到遇到根CA证书(自签名证书)。
  6. 信任锚点检查:根CA证书是否在本地信任存储中。

为什么会这样设计?因为直接信任一个终端证书风险太大。如果某个中间CA被攻破,根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签发的证书。为什么?因为自签名证书无法被撤销。如果私钥泄露,你只能手动更换所有设备上的证书,那工作量...你懂的。