1. 课程导入

在可信计算体系中,TPM(Trusted Platform Module,可信平台模块)是承载平台身份、密钥与度量能力的核心安全芯片。它并不是一颗“加密加速器”那么简单,而是一套围绕密钥层级、平台配置寄存器(PCR)与可信启动链构建的完整信任根。本课程的目标,是带领大家从零开始理解并实现一套可运行的 TPM 密钥管理与 PCR 度量系统,把抽象的可信计算规范落到可编译、可调试、可验证的代码上。

本课程的学习目标可以概括为三条主线:懂原理——掌握 TPM 2.0 的密钥层级、授权模型与 PCR 扩展机制;会开发——能够调用 TSS(TCG Software Stack)完成密钥创建、加载、签名与度量读取;能验证——通过 PCR 值比对与 Quote 远程证明,判断平台是否处于可信状态。

一、核心概念:信任根、密钥层级与 PCR

TPM 的可信性建立在“信任根”之上。它包含三个关键部分:RTS(Root of Trust for Storage,存储信任根)负责保护密钥与敏感数据;RTM(Root of Trust for Measurement,度量信任根)负责启动阶段对固件、引导程序、内核进行度量;RTR(Root of Trust for Reporting,报告信任根)负责以 Quote 形式对外证明平台状态。三者协同,形成从加电到操作系统的可信链。

密钥层级方面,TPM 2.0 采用树状结构:最上层是 endorsement hierarchy(背书层级),用于平台身份与 EK(Endorsement Key);中间是 storage hierarchy(存储层级),用于 SRK(Storage Root Key)及普通存储密钥;还有 platform hierarchy(平台层级)供固件使用,以及 null hierarchy(空层级)用于临时会话。每个密钥都带有属性,例如是否可迁移、是否需授权、是否受 PCR 策略约束。

PCR 是 TPM 内部的一组寄存器,典型平台有 24 个(PCR 0~23)。它们不能直接写入,只能通过“扩展”操作更新:PCR_new = Hash(PCR_old || 度量值)。这种单向性保证了历史度量不可篡改。不同 PCR 有约定用途,例如 PCR 0~7 用于固件与启动链,PCR 8~15 用于操作系统,PCR 16 用于调试,PCR 23 用于应用特定度量。

TPM 密钥层级与 PCR 度量系统整体框架 密钥层级(Hierarchy) 背书层级 Endorsement EK / 平台身份 存储层级 Storage SRK / 存储密钥 平台层级 Platform 固件 / 启动控制 空层级 Null 临时会话 / 易失 密钥属性 可迁移 / 授权 / PCR策略 TPM 2.0 核心 RTS 存储信任根 RTM 度量信任根 RTR 报告信任根 命令 / 会话 / 授权 PCR 度量与证明 PCR 0~7 固件/启动 BIOS、Bootloader PCR 8~15 操作系统 内核、initrd、IMA PCR 16 调试 开发阶段临时度量 PCR 23 应用 业务自定义度量 Quote 远程证明 签名 PCR 摘要 + nonce 扩展公式:PCR_new = Hash(PCR_old ‖ 度量值)

二、方法流程:从密钥创建到 PCR 证明

开发一套 TPM 密钥与 PCR 度量系统,通常遵循以下流程。第一步是环境准备:确认 TPM 2.0 设备可用,安装 TSS 库(如 tpm2-tss、tpm2-tools),并确保内核支持 /dev/tpm0 与 /dev/tpmrm0。第二步是创建主密钥:在存储层级下创建 SRK,作为后续密钥的父节点。第三步是创建受 PCR 策略约束的密钥:指定 PCR 选择与摘要值,使密钥只有在平台状态匹配时才能使用。第四步是读取与扩展 PCR:对目标文件或配置进行度量,并写入指定 PCR。第五步是生成 Quote:用 AK(Attestation Key)对 PCR 摘要签名,附带 nonce 防止重放。第六步是验证:在远端比对 PCR 值与预期基线,判断平台可信性。

# 示例:创建 SRK 并读取 PCR 0
tpm2_createprimary -C o -c primary.ctx
tpm2_create -C primary.ctx -u key.pub -r key.priv
tpm2_load -C primary.ctx -u key.pub -r key.priv -c key.ctx
tpm2_pcrread sha256:0,7
tpm2_quote -c ak.ctx -l sha256:0,7 -q nonce.bin -m quote.msg -s quote.sig

三、案例场景:可信启动与远程证明

假设我们开发一台边缘网关,要求只有经过签名的固件与内核才能访问云端密钥。启动时,BIOS、Bootloader、内核依次被度量并扩展进 PCR 0~7。系统运行后,应用调用 TPM 生成 Quote,把 PCR 摘要与随机数一起发送给云端。云端用预置的 AK 公钥验签,并比对基线库中的 PCR 值。若一致,则下发业务密钥;若不一致,则拒绝并告警。这个场景中,密钥层级提供了“谁能解密”,PCR 提供了“平台是否可信”,两者缺一不可。

四、常见误区与复盘

  • 误区一:把 PCR 当成普通寄存器直接赋值。PCR 只能扩展,不能写入,任何“重置”都需平台层级授权,开发中必须使用扩展接口。
  • 误区二:忽略密钥属性。可迁移密钥与不可迁移密钥用途不同,受 PCR 策略约束的密钥若策略不匹配会直接加载失败。
  • 误区三:Quote 不带 nonce。没有随机数的 Quote 可被重放,远程证明形同虚设。
  • 误区四:只测一次就上线。固件升级、内核更新都会改变 PCR 值,必须建立基线更新与灰度验证机制。
模块关键对象典型接口/命令验证方式
密钥管理EK、SRK、AK、存储密钥tpm2_createprimary / tpm2_create加载成功、签名验签通过
PCR 度量PCR 0~23tpm2_pcrread / tpm2_pcrextend摘要值与基线一致
远程证明Quote、nonce、AK 证书tpm2_quote / tpm2_verifysignature签名有效且 PCR 匹配
策略授权PCR 策略、口令策略tpm2_startauthsession / policy策略满足时方可使用密钥
实战路线图建议按“先通后精”推进:第1周打通 TPM 设备与 tpm2-tools 基本命令;第2周完成 SRK 与普通密钥的创建、加载与签名;第3周实现 PCR 读取、扩展与基线比对;第4周完成 Quote 远程证明闭环;之后进入策略授权、密钥持久化与多平台适配。每完成一个阶段,都用真实 PCR 值和签名日志做一次复盘,确保每一步都可验证、可回退。

本课程后续将围绕上述路线展开,从 TPM 命令会话、密钥模板、PCR 策略到远程证明服务端实现,逐步构建一套完整的开发能力。掌握本章的框架与概念,是后续动手实践的基础。