TEE-OS学习轨迹第十二篇:编译时只传入3 个顶层私钥原因
核心结论
编译时只传入了 3 把顶层私钥,剩下的所有子层级私钥,都会由 cert_create 证书生成工具自动随机生成,这是 TF-A 可信启动的标准设计,无需用户手动提供。
信任链的安全性锚定在根密钥(ROT)上,下级密钥自动生成既简化了配置,又能做到每个固件版本对应独立子密钥,安全性反而更高。
一、完整密钥层级与证书链对应
结合你日志里的证书 ID,完整的信任链层级如下,标注了哪些是你手动指定、哪些是工具自动生成:
层级0:根私钥 ROT_KEY(你手动指定:my_keys/rot_private.pem) ↓ 签发 层级1:可信密钥证书(ID=7) ├─ 包含:可信公钥(对应你指定的 TRUSTED_KEY 的公钥) └─ 包含:非可信公钥(对应你指定的 NON_TRUSTED_KEY 的公钥) ┌─ 层级2:可信私钥 TRUSTED_KEY(你手动指定:my_keys/trusted_private.pem) │ ↓ 签发 │ ├─ 层级2证书1:SoC固件密钥证书(ID=9) │ │ └─ 包含:SoC内容证书公钥 → 对应私钥【工具自动生成】 │ │ ↓ 签发 │ │ └─ 层级3:SoC固件内容证书(ID=13)→ 存放 BL31 哈希 │ │ │ └─ 层级2证书2:可信OS密钥证书(ID=10) │ └─ 包含:TOS内容证书公钥 → 对应私钥【工具自动生成】 │ ↓ 签发 │ └─ 层级3:可信OS内容证书(ID=14)→ 存放 BL32 哈希 │ └─ 层级2:非可信私钥 NON_TRUSTED_KEY(你手动指定:my_keys/nontrusted_private.pem) ↓ 签发 └─ 层级2证书3:非可信固件密钥证书(ID=11) └─ 包含:NT内容证书公钥 → 对应私钥【工具自动生成】 ↓ 签发 └─ 层级3:非可信固件内容证书(ID=15)→ 存放 BL33 哈希和你参数的对应关系
传入的参数 | 对应层级 | 作用 |
ROT_KEY | 层级0 根密钥 | 签发顶层可信密钥证书,是整个信任链的信任锚点,公钥会固化到 BL1 中 |
TRUSTED_KEY | 层级2 可信世界私钥 | 签发安全世界的两类子密钥证书(SoC、TOS) |
NON_TRUSTED_KEY | 层级2 非可信世界私钥 | 签发正常世界的非可信固件密钥证书 |
自动生成的 3 把子密钥
工具会自动生成 3 对 RSA 子密钥对,分别用于签发最底层的内容证书:
- SoC 固件内容证书私钥 → 签发 BL31 对应的内容证书(ID=13)
- 可信OS固件内容证书私钥 → 签发 BL32 对应的内容证书(ID=14)
- 非可信固件内容证书私钥 → 签发 BL33 对应的内容证书(ID=15)
二、自动生成密钥的机制说明
1. 生成规则
- 算法与长度:和根密钥保持一致,默认 RSA 2048 位,可通过 KEY_SIZE=4096 参数修改长度。
- 随机性:每次重新生成证书时,都会重新生成全新的随机子密钥,不同版本固件的子密钥完全独立。
- 默认不保存:自动生成的私钥默认只在内存中使用,签发完内容证书后直接丢弃,不会落盘保存,进一步降低密钥泄露风险。
2. 如何保存自动生成的密钥(调试用)
如果需要把所有子密钥都保存到本地文件(比如调试验签流程、后续重新签发),只需要在编译参数中加 SAVE_KEYS=1:
make ... SAVE_KEYS=1 all fip
生成的私钥会保存在构建目录下,文件名对应为:
- soc_fw_key.pem
- tos_fw_key.pem
- nt_fw_key.pem
三、为什么不需要手动指定所有密钥
这是可信启动的标准设计原则:信任锚点上移,下级密钥分散。
- 安全性不降级:整个信任链的合法性只依赖根密钥,所有下级公钥都有上级私钥签名背书,即使子密钥自动生成,也完全在信任链内。
- 降低泄露风险:子密钥仅用于签发单版本固件的内容证书,用完即弃,即使泄露也只影响单个版本,不会危及根密钥和其他版本。
- 简化配置:用户只需要管理好 3 把核心密钥即可,不需要维护十几把不同层级的密钥,大幅降低运维成本。
如果有特殊需求需要完全自定义所有层级密钥,也可以通过对应参数手动传入,例如:
- SOC_FW_KEY=xxx.pem:指定 SoC 内容证书的签发私钥
- TOS_FW_KEY=xxx.pem:指定可信OS内容证书的签发私钥
- NT_FW_KEY=xxx.pem:指定非可信内容证书的签发私钥
但绝大多数场景下,使用工具自动生成的子密钥是最优选择。
