3、密码学基础(下):公钥基础设施(PKI)、证书链、硬件安全模块(HSM)简介

上一节我们把非对称加密、哈希和签名的原理捋了一遍。但光有算法还不够——你想想看,你拿到了一个公钥,怎么确定它真的是某个设备或某家公司的?

这就是 PKI 要解决的问题。说白了,PKI 就是一套「谁来证明你是谁」的信任机制。我在做安全启动方案时,最头疼的往往不是签名算法选什么,而是证书链怎么设计、根证书怎么保护。这些坑,今天咱们一次性说清楚。

3.1 公钥基础设施(PKI)——信任的起点

PKI 不是一个软件,也不是一个协议。它是一整套角色、策略和流程的集合。核心目标就一个:让一个实体能够安全地获取另一个实体的公钥,并且相信这个公钥是真的。

PKI 里几个关键角色,我列个表,你对照着看:

角色 英文 干什么的
证书颁发机构 CA 签发证书,证明「这个公钥属于这个实体」
注册机构 RA 审核申请者的身份,把审核结果交给 CA
证书持有者 Subject 拥有公私钥对,公钥被 CA 签名后形成证书
依赖方 Relying Party 拿到证书,验证签名,决定是否信任
证书吊销列表 CRL CA 发布的「已失效证书黑名单」

在安全启动场景里,设备固件就是依赖方。它拿到一个签名后的固件包,里面附带一张证书。设备要做的,就是验证这张证书是否由它信任的 CA 签发。

核心要点:PKI 的本质是「信任传递」。你不需要事先知道每个设备的公钥,你只需要信任一个根 CA,然后让根 CA 去担保其他所有公钥。

3.2 证书与X.509标准

证书长什么样?目前最通用的格式是 X.509 v3。我拆开给你看:

  • 版本号:通常是 v3
  • 序列号:CA 给每张证书的唯一编号
  • 签名算法:CA 签名时用的哈希+非对称算法,比如 sha256WithRSAEncryption
  • 颁发者:签发这张证书的 CA 名称
  • 有效期:起止时间
  • 主体:证书持有者的名称
  • 主体公钥信息:持有者的公钥和算法
  • 扩展:用途约束、密钥用法、CA 标志等
  • 签名值:CA 用私钥对整个证书内容的签名

我在项目中遇到过一种情况:某款芯片的 bootrom 只支持解析 X.509 v3 证书,但固件打包工具生成的是 v1 格式。结果设备启动时直接卡死,连 log 都打不出来。嗯,这种低级错误排查起来最费时间。

实战建议:在固件签名工具里,一定要显式指定证书版本和扩展字段。不要依赖 OpenSSL 的默认行为,不同版本默认值可能不一样。

3.3 证书链——从根到叶子

单张证书不够用。你想,如果根 CA 的私钥泄露了,整个信任体系就崩了。所以实际部署时,我们通常用证书链。

证书链分三层:

  1. 根证书:自签名,最顶层的信任锚。私钥必须离线保存,极少使用。
  2. 中间证书:由根 CA 签发,用于日常签发叶子证书。即使中间 CA 私钥泄露,根 CA 可以吊销它,不影响整个体系。
  3. 叶子证书:由中间 CA 签发,绑定具体的设备或固件签名密钥。

验证流程是这样的:设备固件里预置了根证书的公钥。当它收到一个固件包,包里附带叶子证书和中间证书。设备先用根公钥验证中间证书的签名,再用中间证书的公钥验证叶子证书的签名。全部通过,才信任叶子证书里的公钥。

下面这张图把证书链的签发和验证流程画清楚了:

证书链签发与验证流程 证书链签发与验证流程 根 CA(自签名) 中间 CA 叶子证书(设备/固件) 签发中间证书 签发叶子证书 验证:用中间公钥 验证:用根公钥 说明: • 签发方向:根CA → 中间CA → 叶子证书(私钥签名) • 验证方向:叶子证书 → 中间CA → 根CA(公钥验签) • 设备固件只需预置根CA公钥,即可验证整条链 • 中间CA私钥泄露时,根CA可吊销其中间证书,不影响根信任

注意:证书链的验证顺序和签发顺序是相反的。我曾经见过有同事在代码里把验证顺序搞反了,先验叶子再验根,结果签名校验永远通不过。调试了两天才发现是逻辑顺序问题。

3.4 硬件安全模块(HSM)——私钥的保险柜

私钥放在哪里最安全?硬盘?不行,容易被偷。内存?也不行,能 dump。那放哪?HSM。

HSM 是一种专用的硬件设备,专门用来安全地生成、存储和使用密钥。它的核心特性:

  • 密钥永不离开硬件:私钥在 HSM 内部生成,内部存储,签名操作也在内部完成。外部只能拿到公钥和签名结果。
  • 防篡改:HSM 有物理防护,拆开外壳会触发自毁机制,密钥立即被擦除。
  • 合规认证:FIPS 140-2 Level 3 或更高,满足金融、政府等高安全场景要求。
  • 高性能:专用硬件加速,RSA-4096 签名每秒能跑几千次。

在安全固件签名场景里,HSM 通常用于保护根 CA 和中间 CA 的私钥。我参与过的一个汽车项目,客户的根 CA 私钥就放在一台 HSM 里,这台 HSM 锁在保险柜中,需要两个人同时刷卡才能操作。你说夸张不夸张?但想想看,如果根私钥泄露,所有已出货的百万台车都得召回,这个代价谁扛得住?

关键认知:HSM 不是用来加速的,是用来「锁死」私钥的。签名速度再快,如果私钥不安全,一切都是零。

3.5 在安全启动中如何落地

好了,理论说完了。咱们看看这些东西在安全启动里怎么配合:

  1. 产线阶段:HSM 生成根 CA 密钥对,签发中间 CA 证书。中间 CA 再签发每台设备的叶子证书。叶子证书和对应的私钥烧录进设备的 eFuse 或安全存储区。
  2. 开发阶段:开发人员用中间 CA 的私钥(通过 HSM 或受控的签名服务器)对固件进行签名。签名结果和叶子证书一起打包进固件镜像。
  3. 启动阶段:BootROM 读取固件包,提取证书链。用预置的根公钥验证中间证书,再用中间公钥验证叶子证书。最后用叶子公钥验证固件签名。全部通过,才跳转到固件代码执行。

这里有个细节:设备里预置的根公钥怎么放?我建议放在一次性可编程存储器(OTP)里,比如 eFuse。一旦写入,任何人都改不了,包括你自己。这样即使攻击者拿到了设备的完整控制权,也无法替换根公钥。

避坑指南:我曾经在一个项目里看到,工程师把根公钥放在 Flash 里,还加了 CRC 校验。结果攻击者直接替换了 Flash 内容,同时更新了 CRC。嗯,这种「防君子不防小人」的方案,在安全启动里是绝对不行的。

3.6 小结

这一节我们聊了 PKI 的信任模型、X.509 证书的结构、证书链的签发验证流程,还有 HSM 这个私钥保险柜。这些东西单独看都不难,但组合起来就是安全启动的信任基石。

你想想看,没有 PKI,设备怎么知道固件是谁签的?没有证书链,根私钥暴露风险多大?没有 HSM,私钥存哪里都不踏实。这三样东西,缺一个,安全启动就是空中楼阁。