4. TPM与远程证明

聊远程证明,TPM 是绕不开的硬件根基。我最早接触 TPM 是在做一款工控设备的可信启动方案,那时候还是 TPM 1.2,功能有限,接口也拧巴。后来换到 TPM 2.0,才感觉这东西终于「能打了」。这一节,我把 TPM 2.0 的核心架构、PCR、度量启动和 Quote 机制串起来讲,你理解透了,远程证明的硬件侧就算入门了。

4.1 TPM 2.0 架构:不再只是一个「密码芯片」

TPM 2.0 相比 1.2,最大的变化是架构从「固定功能」变成了「可扩展引擎」。说白了,它不再是一块焊死的黑盒,而是一个可以加载不同算法、不同命令集的密码协处理器。

我个人习惯把 TPM 2.0 的架构分成三层来看:

  • 接口层:与 CPU 通信的通道,常见 LPC、SPI、I²C。这部分决定了 TPM 的响应速度。
  • 命令处理层:解析 TPM 命令,调度执行。TPM 2.0 定义了超过 100 条命令,比 1.2 多了好几倍。
  • 资源管理层:管理内部密钥、会话、PCR 等资源。这是 TPM 2.0 的精髓——资源可以动态加载和卸载,不再受限于固定数量的密钥槽。

关键区别:TPM 1.2 只支持 RSA 和 SHA-1,算法固定;TPM 2.0 支持 RSA、ECC、SHA-256、SM3 等,算法可扩展。我在项目中遇到过客户要求必须用国密 SM2/SM3,TPM 1.2 直接出局,2.0 才能满足。

TPM 2.0 内部还有一个重要的概念叫 Hierarchy(层次)。每个层次有独立的种子、策略和授权。常用的三个层次是:

层次名称 用途 持久性
Platform Hierarchy 平台固件控制,用于早期启动阶段 平台复位后清除
Storage Hierarchy 存储密钥管理,最常用 持久保存
Endorsement Hierarchy 用于远程证明的隐私敏感操作 持久保存

嗯,这里要注意:远程证明通常走 Endorsement Hierarchy,因为它生成的密钥(EK)与硬件绑定,且可以派生匿名的身份密钥(AK),保护设备隐私。

4.2 平台配置寄存器(PCR):系统的「指纹记录仪」

PCR 是 TPM 内部的一组寄存器,用来记录系统状态。每个 PCR 只能做一件事:扩展(Extend)。

扩展操作很简单:PCR[n] = SHA256(PCR[n] || new_measurement)。新值跟旧值拼起来再哈希,结果写回 PCR。这意味着 PCR 的值是累积的,你没法回退,也没法伪造。

TPM 2.0 通常有 24 个 PCR(0-23),每个有特定用途:

PCR 索引 典型用途 谁在度量
0-7 BIOS、固件、Boot Loader 平台固件
8-15 OS 内核、驱动、启动服务 Boot Loader / OS
16-23 应用层、调试状态、自定义 OS / 应用

实战经验:我曾经排查过一个 PCR 值对不上的问题,折腾了两天,最后发现是 BIOS 版本升级后,PCR 0-7 的度量顺序变了。所以做远程证明时,一定要把 PCR 选择跟固件版本一起管理,否则验证端永远报错。

PCR 的值在系统重启后清零(除了部分保留的)。所以每次启动,PCR 都是从 0 开始重新累积。这保证了每次启动的度量链都是完整的、可追溯的。

4.3 度量启动(Measured Boot):从按下电源键开始的可信链

度量启动不是「启动」,而是「记录启动过程」。它不阻止恶意代码运行,而是把每一步的度量值记到 PCR 里,供后续验证。

典型的度量启动流程是这样的:

  1. CRTM(Core Root of Trust for Measurement):固化在 BIOS 中的一小段代码,不可篡改。它度量 BIOS 主固件,把哈希扩展到 PCR 0。
  2. BIOS 主固件:度量 Option ROM、Boot Loader,扩展到 PCR 2-4。
  3. Boot Loader:度量 OS 内核、initramfs,扩展到 PCR 8-9。
  4. OS 内核:度量驱动、关键服务,扩展到 PCR 10-15。

每一步的度量者都要先度量下一步的代码,再把控制权交出去。这就是所谓的「可信链传递」。

注意:度量启动不等于安全启动(Secure Boot)。安全启动是验证签名,阻止未签名代码运行;度量启动只是记录,不阻止。两者可以配合使用,但不要混淆。我在一次方案评审中看到有人把两者混为一谈,差点导致设计返工。

下面这张图展示了度量启动的完整链条和 PCR 的对应关系:

度量启动(Measured Boot)可信链与 PCR 映射 CRTM BIOS 主固件 Boot Loader OS 内核 → PCR 0 → PCR 2-4 → PCR 8-9 → PCR 10-15 说明: 每一步的度量者先度量下一步代码,将哈希值扩展到对应 PCR,再移交控制权。 PCR 值 = SHA256(旧值 || 新度量值),不可回退,不可伪造。 可信链传递:CRTM → BIOS → Boot Loader → OS 内核 每个环节的度量值都锁定在 PCR 中,形成完整的启动证据链

4.4 TPM Quote 机制:把 PCR 值「签名」发给验证方

PCR 值存在 TPM 里,怎么让远程的验证方相信这些值是真的?直接读出来发过去肯定不行——中间人可以把假 PCR 值替换掉。这时候就需要 TPM Quote 了。

TPM Quote 的本质是:TPM 用 Attestation Key(AK)对一组 PCR 值签名,然后把签名结果和 PCR 值一起发给验证方。验证方用 AK 的公钥验签,就能确认 PCR 值确实来自那个 TPM,且未被篡改。

Quote 的典型流程:

  1. 挑战方生成一个随机数(Nonce),发给设备,防止重放攻击。
  2. 设备调用 TPM2_Quote 命令,传入 PCR 选择列表和 Nonce。
  3. TPM 读取指定 PCR 的当前值,拼上 Nonce,用 AK 私钥签名,返回签名结果和 PCR 值。
  4. 设备把签名结果、PCR 值、AK 证书(或公钥)打包发给挑战方。
  5. 挑战方验签,比对 PCR 值是否与预期一致。

核心要点:Quote 不传输 PCR 值本身是否「安全」,它只保证 PCR 值确实来自那个 TPM,且是当前时刻的真实值。至于 PCR 值是否等于「干净系统」的预期值,那是验证方的事。

这里有个细节:AK 从哪里来?AK 是由 Endorsement Key(EK)派生或签发的。EK 是 TPM 出厂时烧录的根密钥,对应 Endorsement Hierarchy。AK 可以匿名,不暴露 EK,保护设备隐私。我在做金融终端项目时,客户要求 AK 必须可撤销,我们就在 AK 证书里加了有效期和吊销列表,每季度轮换一次。

避坑指南:我曾经遇到一个坑——TPM 的 AK 证书链验证失败。原因是 TPM 厂商的根证书没导入到验证方的信任存储里。所以做远程证明方案时,一定要提前规划好证书分发和信任锚点,别等到联调才发现。

4.5 小结:TPM 在远程证明中的角色

总结一下,TPM 在远程证明里干了三件事:

  • 度量:通过 PCR 记录系统启动和运行状态,形成不可篡改的证据。
  • 签名:通过 Quote 机制,用 AK 对 PCR 值签名,证明证据的真实性和时效性。
  • 保护:EK 和 AK 私钥永远不出 TPM,硬件隔离,软件拿不到。

你想想看,如果没有 TPM,远程证明的「信任根」就只能依赖软件,软件可以被篡改,信任链就断了。TPM 提供了硬件级别的信任锚点,让远程证明有了可信的起点。