1. 课程导入
在可信计算体系中,TPM(Trusted Platform Module,可信平台模块)是承载平台身份、密钥与度量能力的核心安全芯片。它并不是一颗“加密加速器”那么简单,而是一套围绕密钥层级、平台配置寄存器(PCR)与可信启动链构建的完整信任根。本课程的目标,是带领大家从零开始理解并实现一套可运行的 TPM 密钥管理与 PCR 度量系统,把抽象的可信计算规范落到可编译、可调试、可验证的代码上。
一、核心概念:信任根、密钥层级与 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 用于应用特定度量。
二、方法流程:从密钥创建到 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~23 | tpm2_pcrread / tpm2_pcrextend | 摘要值与基线一致 |
| 远程证明 | Quote、nonce、AK 证书 | tpm2_quote / tpm2_verifysignature | 签名有效且 PCR 匹配 |
| 策略授权 | PCR 策略、口令策略 | tpm2_startauthsession / policy | 策略满足时方可使用密钥 |
本课程后续将围绕上述路线展开,从 TPM 命令会话、密钥模板、PCR 策略到远程证明服务端实现,逐步构建一套完整的开发能力。掌握本章的框架与概念,是后续动手实践的基础。