2、信任根(RoT)构建:硬件信任根(TPM、HSM)、软件信任根(Bootloader、OS Kernel)、信任链传递机制

聊远程证明,绕不开一个核心问题:你的设备凭什么证明自己是可信的?

说白了,你得有一个“绝对可信”的起点。这个起点就是信任根(Root of Trust, RoT)。没有它,后面所有的证明都是空中楼阁。我这些年做过的项目,但凡远程证明出问题,十有八九是信任根没扎稳。

2.1 硬件信任根:TPM 与 HSM

硬件信任根,就是把信任建立在物理芯片上。它不可篡改,也不可被软件轻易读取。我个人习惯把硬件信任根分为两类:TPM 和 HSM。

2.1.1 TPM(可信平台模块)

TPM 是一个廉价的、集成在主板上的安全芯片。它干三件事:

  • 存储保护:密钥、证书等敏感数据,一旦写入 TPM 的防篡改存储区,软件就拿不走。
  • 度量(Measurement):启动时对固件、Bootloader、OS Kernel 进行哈希计算,并把结果扩展到平台配置寄存器(PCR)中。
  • 证明(Attestation):用 TPM 内部的私钥对 PCR 值签名,生成一个“可信报告”发给验证方。
我的经验:TPM 的 PCR 寄存器是“只扩展不重置”的。也就是说,你只能往里面追加哈希值,不能回退。这个特性保证了度量结果的不可伪造性。我在一个 IoT 项目中,曾利用 PCR 的扩展特性,成功检测到了 Bootloader 被恶意替换的情况。

2.1.2 HSM(硬件安全模块)

HSM 比 TPM 更“重”,也更贵。它通常是一个独立的硬件设备,或者是一个高性能的安全芯片。HSM 的核心能力是:

  • 密钥生命周期管理:密钥的生成、存储、使用、销毁,全在硬件内部完成。
  • 高吞吐量密码运算:每秒可以执行数千次甚至数万次签名/验签操作。
  • 物理防护:具备主动防拆解、防侧信道攻击的能力。

什么时候用 HSM?当你的设备需要处理大量证明请求,或者密钥价值极高(比如根 CA 密钥)时,HSM 是唯一选择。

特性 TPM HSM
成本 低(几美元) 高(几百到几万美元)
性能 低(适合启动度量) 高(适合大规模签名)
物理防护 基础(防篡改封装) 高级(主动防拆解)
典型场景 PC、服务器、IoT 设备 CA 中心、金融支付、云服务
注意:TPM 和 HSM 不是二选一的关系。在一些高安全场景中,我见过用 HSM 保护 TPM 的根密钥,形成“硬件信任根嵌套”。这种做法虽然复杂,但确实能提升整体安全性。

2.2 软件信任根:Bootloader 与 OS Kernel

硬件信任根是“地基”,但房子还得靠软件来盖。软件信任根,就是确保从硬件启动到操作系统运行这个过程中,每一步的代码都是可信的。

2.2.1 Bootloader 信任根

Bootloader 是设备上电后运行的第一个软件。它必须被硬件信任根度量。我建议的做法是:

  1. 不可变 Boot ROM:芯片出厂时,固化一段只读的 Boot ROM 代码。这段代码负责验证外部 Flash 中的 Bootloader 签名。
  2. 签名验证:Boot ROM 使用公钥(通常烧录在 OTP 中)验证 Bootloader 的数字签名。验证通过,才跳转执行。
  3. 度量扩展:Bootloader 启动后,立即度量 OS Kernel 的镜像,并将哈希值扩展到 TPM 的 PCR 中。

嗯,这里要注意:Boot ROM 的公钥必须物理不可更改。我曾经遇到一个项目,公钥存储在可擦写的 Flash 中,结果攻击者直接替换了公钥,绕过了签名验证。那真是血的教训。

2.2.2 OS Kernel 信任根

OS Kernel 是系统安全的基础。它需要做到:

  • 内核完整性度量:Kernel 在加载时,Bootloader 已经度量过它的哈希值。但 Kernel 启动后,还需要对关键内核模块(如驱动、文件系统)进行度量。
  • IMA(Integrity Measurement Architecture):Linux 内核的 IMA 子系统可以在文件被访问时,自动度量其完整性,并将结果扩展到 TPM 的 PCR 中。
  • 内核代码签名:强制要求所有内核模块必须带有有效签名才能加载。这可以有效防止恶意内核模块注入。
核心观点:软件信任根不是“一次性”的。它需要在系统运行的整个生命周期中,持续度量、持续报告。IMA 就是实现“运行时信任链”的关键技术。

2.3 信任链传递机制

信任链传递,就是把信任从硬件信任根,一级一级传递到上层软件。这个过程就像接力赛:每一棒(组件)都要证明自己是可信的,然后把信任交给下一棒。

我画了一张图,帮你理解这个传递过程:

信任链传递机制 硬件信任根 TPM / HSM Bootloader 签名验证 + 度量 OS Kernel IMA + 模块签名 应用层 远程证明服务 信任链:硬件 → Bootloader → Kernel → 应用,每一级都度量并报告给下一级

信任链传递的核心原则是:前一级必须度量并验证后一级的完整性。具体来说:

  • 硬件信任根度量 Bootloader:TPM 或 Boot ROM 验证 Bootloader 的签名和哈希。
  • Bootloader 度量 Kernel:Bootloader 计算 Kernel 镜像的哈希,扩展到 PCR,然后跳转。
  • Kernel 度量应用:Kernel 通过 IMA 或类似机制,度量关键应用和库的完整性。
避坑指南:我曾经在一个项目中,信任链在 Bootloader 到 Kernel 这一步断了。原因是 Bootloader 度量了 Kernel,但 Kernel 启动后没有把度量结果扩展到 TPM 的 PCR 中。结果验证方收到的 PCR 值里,缺少了 Kernel 的度量信息。记住:度量结果必须“写”进 PCR,不能只“算”一下就算了。

2.4 信任根构建的实战建议

说了这么多理论,来点实际的。我总结了几条构建信任根时的经验:

  1. 优先选择硬件信任根:纯软件信任根(比如只靠签名验证)容易被绕过。只要成本允许,尽量上 TPM 或 HSM。
  2. 信任链要“短”:信任链越长,攻击面越大。理想情况下,信任链不超过 4 级(硬件 → Bootloader → Kernel → 应用)。
  3. 度量要“早”:度量动作越早执行越好。最好在组件加载之前就完成度量,而不是加载之后。
  4. PCR 使用要“专”:不同的 PCR 寄存器用于不同的度量目的。比如 PCR[0] 用于 BIOS,PCR[1] 用于 Bootloader,PCR[2] 用于 Kernel。不要混用。
警告:信任根不是“一劳永逸”的。攻击者可能通过物理手段(如探针、激光)直接读取 TPM 内部密钥。对于高安全场景,建议配合使用物理防篡改封装和主动检测机制。