《安全启动验证方法实操课程》
第3章 密码学基础(二)
第三节:密码学基础(二)——数字签名、PKI与证书链
在上一节中,我们学习了对称与非对称加密,解决了“如何秘密通信”的问题。但在嵌入式安全启动中,我们更关心“如何验证代码的发布者”以及“如何确保代码未被篡改”。本节将深入探讨数字签名、公钥基础设施(PKI)以及证书链,这些是构建可信执行环境的基石。
3.1 数字签名:身份认证与完整性保障
数字签名是非对称加密的逆用。发送方使用私钥对数据的哈希值进行签名,接收方使用公钥验证签名。这提供了两个核心安全属性:
- 真实性(Authentication):证明数据确实来自持有私钥的特定实体。
- 完整性(Integrity):证明数据在传输过程中未被修改。
3.1.1 RSA 数字签名
RSA 签名基于大整数分解难题。签名过程即使用私钥指数 \(d\) 对哈希值 \(h\) 进行模幂运算:\(s = h^d \mod n\)。验证过程使用公钥指数 \(e\):\(h' = s^e \mod n\),若 \(h'\) 与原始哈希匹配,则验证通过。
3.1.2 ECDSA 数字签名
ECDSA(椭圆曲线数字签名算法)基于椭圆曲线离散对数难题。相比 RSA,ECDSA 在提供相同安全强度时,密钥长度更短、计算效率更高,非常适合资源受限的嵌入式设备。签名由一对值 \((r, s)\) 组成。
3.2 公钥基础设施(PKI)与证书
在安全启动中,设备需要验证固件签名者的公钥是否可信。PKI 通过引入证书颁发机构(CA)解决了“公钥分发”的信任问题。数字证书将公钥与实体身份绑定,并由 CA 签名。
3.2.1 X.509 证书结构
| 字段 | 说明 | 安全启动中的意义 |
|---|---|---|
| 版本号 | 证书格式版本(通常为 V3) | 兼容性判断 |
| 序列号 | CA 分配的唯一标识 | 吊销列表查询 |
| 签名算法 | 如 sha256WithRSAEncryption | 指定验证算法 |
| 颁发者 | 签发该证书的 CA 名称 | 构建证书链 |
| 有效期 | 起始与结束时间 | 检查证书是否过期 |
| 主体 | 证书持有者身份 | 固件发布者身份 |
| 公钥信息 | 算法 + 公钥值 | 用于验证签名 |
| 扩展项 | 密钥用途、基本约束等 | 限制证书用途(如仅用于代码签名) |
3.3 证书链与信任根
嵌入式设备通常预置一个根证书(信任锚)。固件签名证书由中间 CA 签发,中间 CA 再由根 CA 签发,形成证书链。验证时,设备从固件证书开始,逐级向上验证,直到信任的根证书。
3.4 安全启动中的实践
在嵌入式安全启动中,证书链验证通常发生在 BootROM 或早期启动阶段:
- 硬件信任根:根证书公钥的哈希值烧录在一次性可编程(OTP)存储器中。
- 逐级验证:BootROM 使用根公钥验证 Bootloader 1 的签名证书,Bootloader 1 再验证 Bootloader 2,最终验证 OS 内核。
- 抗回滚:结合版本号检查,防止攻击者加载旧版本的有漏洞固件。
3.4.1 代码示例:使用 OpenSSL 进行 ECDSA 签名与验证
# 1. 生成 ECDSA 私钥(P-256 曲线)
openssl ecparam -genkey -name prime256v1 -out firmware_priv.pem
# 2. 提取公钥
openssl ec -in firmware_priv.pem -pubout -out firmware_pub.pem
# 3. 对固件镜像进行签名
openssl dgst -sha256 -sign firmware_priv.pem -out firmware.bin.sig firmware.bin
# 4. 验证签名
openssl dgst -sha256 -verify firmware_pub.pem -signature firmware.bin.sig firmware.bin
# 输出: Verified OK
3.5 本节要点总结
| 概念 | 核心作用 | 安全启动中的角色 |
|---|---|---|
| RSA 签名 | 基于大整数分解,广泛兼容 | 传统 BootROM 验证 |
| ECDSA 签名 | 短密钥、高性能,适合 IoT | 现代嵌入式安全启动首选 |
| X.509 证书 | 绑定公钥与身份信息 | 固件发布者身份凭证 |
| 证书链 | 分层信任模型 | 从根证书到固件证书的信任传递 |
| PKI | 管理密钥与证书的生命周期 | 提供可撤销、可更新的信任体系 |