TEE-OS学习轨迹第十二篇:编译时只传入3 个顶层私钥原因

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 子密钥对,分别用于签发最底层的内容证书:
  1. SoC 固件内容证书私钥 → 签发 BL31 对应的内容证书(ID=13)
  2. 可信OS固件内容证书私钥 → 签发 BL32 对应的内容证书(ID=14)
  3. 非可信固件内容证书私钥 → 签发 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

三、为什么不需要手动指定所有密钥

这是可信启动的标准设计原则:信任锚点上移,下级密钥分散
  1. 安全性不降级:整个信任链的合法性只依赖根密钥,所有下级公钥都有上级私钥签名背书,即使子密钥自动生成,也完全在信任链内。
  2. 降低泄露风险:子密钥仅用于签发单版本固件的内容证书,用完即弃,即使泄露也只影响单个版本,不会危及根密钥和其他版本。
  3. 简化配置:用户只需要管理好 3 把核心密钥即可,不需要维护十几把不同层级的密钥,大幅降低运维成本。
如果有特殊需求需要完全自定义所有层级密钥,也可以通过对应参数手动传入,例如:
  • SOC_FW_KEY=xxx.pem:指定 SoC 内容证书的签发私钥
  • TOS_FW_KEY=xxx.pem:指定可信OS内容证书的签发私钥
  • NT_FW_KEY=xxx.pem:指定非可信内容证书的签发私钥
但绝大多数场景下,使用工具自动生成的子密钥是最优选择。