4. TPM密钥体系

TPM 2.0 的可信能力并不是靠单一密钥完成的,而是由一组职责分明、层级清晰的密钥共同支撑。理解 EK、SRK、AIK、DK、NK 等密钥的定位,是开发 PCR 度量、远程证明和密钥封装功能的基础。本节从密钥类型、生成流程、持久化方式和授权策略四个角度展开,帮助你在代码中正确选择和使用这些密钥。

一、核心原理:TPM 密钥的层级与职责

TPM 内部采用树状密钥层级结构。位于最顶层的是种子密钥(Seed),由 TPM 内部随机数发生器在制造或首次启动时生成,永不离开芯片。种子派生出主密钥(Primary Key),主密钥再派生出各级子密钥。这种设计使得 TPM 无需存储大量密钥,只需保存种子即可按需重建整棵密钥树。

常见密钥类型及其职责如下:

  • EK(Endorsement Key,背书密钥):每个 TPM 唯一,通常由厂商在制造时注入,用于标识设备身份,是隐私敏感密钥,一般不直接用于加密业务数据。
  • SRK(Storage Root Key,存储根密钥):存储层级的根,用于加密保护其他密钥的私有部分,是密钥树中存储分支的起点。
  • AIK(Attestation Identity Key,证明身份密钥):用于对 PCR 值签名,实现远程证明,避免直接暴露 EK 身份。
  • DK(Decryption Key,解密密钥):用于解密受 TPM 保护的数据,常与特定 PCR 状态绑定。
  • NK(Nonce/Null Key 或通用密钥):在具体实现中可指代临时密钥或通用用途密钥,用于会话、签名或封装场景。
记忆要点:EK 证明“我是谁”,SRK 保护“我的密钥”,AIK 证明“我的状态”,DK 解密“我的数据”,NK 承担“临时或通用任务”。

二、方法流程:密钥生成、加载与持久化

TPM 密钥的典型生命周期包括生成、加载、使用和持久化四个阶段。以创建 SRK 为例,流程如下:

  1. 调用 Tss2_CreatePrimary,指定主密钥模板和层级(Owner/Platform/Endorsement/Null)。
  2. TPM 根据种子和模板确定性地派生出主密钥,返回句柄和公钥区域。
  3. 使用该句柄进行后续子密钥创建,子密钥的私有部分被 SRK 加密后返回给调用者保存。
  4. 需要长期使用时,调用 Tss2_EvictControl 将密钥持久化到 TPM 非易失存储。

下面是一段使用 tpm2-tools 创建并持久化 SRK 的示例命令:

# 创建主密钥(SRK),保存上下文
tpm2_createprimary -C o -G rsa2048 -c primary.ctx

# 在 SRK 下创建子密钥
tpm2_create -C primary.ctx -G rsa2048 -u key.pub -r key.priv

# 加载子密钥
tpm2_load -C primary.ctx -u key.pub -r key.priv -c key.ctx

# 将子密钥持久化到 TPM 句柄 0x81010001
tpm2_evictcontrol -C o -c key.ctx 0x81010001

持久化后,密钥即使断电也不会丢失,但会占用 TPM 有限的非易失存储槽位。因此,通常只持久化 SRK、AIK 等关键密钥,普通子密钥按需重建即可。

三、授权策略:口令、PCR 与策略会话

TPM 密钥的授权方式决定了“谁在什么条件下可以使用该密钥”。常见策略包括:

  • 空授权:无需口令,适用于公开密钥或测试环境。
  • 口令授权:使用 HMAC 或口令会话,适合用户级保护。
  • PCR 策略:将密钥绑定到特定 PCR 值,只有系统处于预期状态时才能使用。
  • 策略会话(Policy Session):支持组合条件,如 PCR + 口令 + 时间限制。

例如,将 DK 绑定到 PCR 0、1、7 的策略命令如下:

# 创建 PCR 策略
tpm2_startauthsession -S session.ctx
tpm2_policypcr -S session.ctx -l sha256:0,1,7 -L pcr.policy
tpm2_flushcontext session.ctx

# 使用策略创建密钥
tpm2_create -C primary.ctx -G rsa2048 -u dk.pub -r dk.priv -L pcr.policy

这样生成的 DK 只有在 PCR 0、1、7 与策略中记录的值一致时才能被加载使用,从而实现“系统状态可信才解密”的安全目标。

四、案例与场景:远程证明中的 AIK 使用

在远程证明场景中,服务端需要确认客户端系统未被篡改。客户端使用 AIK 对当前 PCR 值签名,服务端用 AIK 公钥验证签名,并比对预期 PCR 基准值。AIK 本身由 EK 或 SRK 派生,并通过证书链证明其来自合法 TPM。这样既保护了 EK 隐私,又实现了可验证的状态证明。

密钥类型 主要用途 是否持久化 典型授权策略
EK 设备身份标识 是(厂商注入) 通常不可直接使用
SRK 保护子密钥 是 口令或空授权
AIK PCR 签名与远程证明 是 口令或策略
DK 数据解密 按需 PCR 策略
NK 临时会话或通用任务 否 空授权或会话

五、误区与复盘

常见误区一:把 EK 当作普通加密密钥使用。EK 涉及隐私,应通过 AIK 间接使用。
常见误区二:所有密钥都持久化。TPM 非易失槽位有限,滥用会导致后续密钥无法保存。
常见误区三:忽略 PCR 策略的灵活性。PCR 值会随系统更新变化,策略过严会导致正常升级后密钥不可用。

复盘建议:在设计密钥体系时,先明确“谁使用、保护什么、在什么状态下可用”,再选择密钥类型和授权策略。对于需要跨重启使用的密钥,优先考虑持久化 SRK 和 AIK;对于数据保护密钥,优先使用 PCR 策略并预留策略更新机制。只有将密钥类型、生成流程、持久化和授权策略统一规划,才能构建既安全又可持续演进的 TPM 应用。

TPM 2.0 密钥层级与授权策略 种子 Seed 芯片内部,永不导出 主密钥 Primary Key 由种子确定性派生 EK 背书密钥 设备身份标识 厂商注入 · 隐私敏感 SRK 存储根密钥 保护子密钥 存储层级根 AIK 证明身份密钥 PCR 签名 远程证明 DK 解密密钥 数据解密 PCR 策略绑定 NK 通用/临时密钥 会话 · 签名 · 封装 空授权 口令授权 PCR 策略 策略会话 持久化槽位