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 是设备上电后运行的第一个软件。它必须被硬件信任根度量。我建议的做法是:
- 不可变 Boot ROM:芯片出厂时,固化一段只读的 Boot ROM 代码。这段代码负责验证外部 Flash 中的 Bootloader 签名。
- 签名验证:Boot ROM 使用公钥(通常烧录在 OTP 中)验证 Bootloader 的数字签名。验证通过,才跳转执行。
- 度量扩展: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 信任链传递机制
信任链传递,就是把信任从硬件信任根,一级一级传递到上层软件。这个过程就像接力赛:每一棒(组件)都要证明自己是可信的,然后把信任交给下一棒。
我画了一张图,帮你理解这个传递过程:
信任链传递的核心原则是:前一级必须度量并验证后一级的完整性。具体来说:
- 硬件信任根度量 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 信任根构建的实战建议
说了这么多理论,来点实际的。我总结了几条构建信任根时的经验:
- 优先选择硬件信任根:纯软件信任根(比如只靠签名验证)容易被绕过。只要成本允许,尽量上 TPM 或 HSM。
- 信任链要“短”:信任链越长,攻击面越大。理想情况下,信任链不超过 4 级(硬件 → Bootloader → Kernel → 应用)。
- 度量要“早”:度量动作越早执行越好。最好在组件加载之前就完成度量,而不是加载之后。
- PCR 使用要“专”:不同的 PCR 寄存器用于不同的度量目的。比如 PCR[0] 用于 BIOS,PCR[1] 用于 Bootloader,PCR[2] 用于 Kernel。不要混用。
警告:信任根不是“一劳永逸”的。攻击者可能通过物理手段(如探针、激光)直接读取 TPM 内部密钥。对于高安全场景,建议配合使用物理防篡改封装和主动检测机制。