Key Management in TPM based Security

Contents

TPM(可信平台模块)本质上并不会直接存储完整的密钥,而是持久化存储称为 Seed(种子)的秘密值,并通过这些 Seed 确定性地派生出各种密钥。两类常见的 Seed 和对应的密钥体系是 Endorsement 和 Stroage,如下所示:

Seed 类型 密钥体系 用途简述
Endorsement Seed Endorsement Key(EK) 识别 TPM 的密钥
Storage Seed Storage Root Key(SRK) 本地应用使用的密钥
    Figure 1. Endorcement and Storage types in TPM Key Management

上述密钥按照用途分为两类:Restricted 和 Non-Restricted。

  • Restricted:用于签名或者解密 TPM 的状态和数据,例如,签名启动度量值、证明某个密钥位于同一个 TPM,EK、SRK、AIK 都在此类;
  • Non-Restricted:用于一般用途,例如,TLS 客户端的密钥、签名普通文档的密钥,应用密钥(Application Key)属于此类。

Endorsement Key

Endorsement Key(EK)是 TPM 的身份标识,由 TPM 制造商配置。

  • EK 公私钥对由已知模板(EK Template)、Endorsement Primary Seed(EPS)和选定的密钥派生函数(KDF)、通过 TPM2_CreatePrimary() 确定性生成;
  • EK 证书由TPM制造商的证书颁发机构(CA)签发并将其存储到 TPM NVRAM;
  • EK 证书包含EK公钥以及其他字段,例如,TPM 制造商名称、组件型号、组件版本、密钥 ID 等。

EK Template 的具体格式可查阅:Default EK Template (TPMT_PUBLIC): RSA 2048 (Storage)

EK 被存储在 TPM Shielded Location,私钥永远不能暴露,公钥可从 TPM 内读取。

关于 TPM 的安全存储有两个概念:

  • Isolated Locations:安全系统的非易失性存储,具有访问控制能力,不允许来自系统边界外的访问;
  • Shielded Locations:具有防篡改能力的 Shielded Location,通常用于存储秘密值;

Storage Root Key

在 TPM 的 Storage 体系结构中,密钥的创建遵循树状层级结构:

  • 比如 Attestation Key(AK)或应用密钥,都是在 TPM 的存储体系下生成的;
  • SRK(Storage Root Key)是这棵树的根密钥,用于保护子密钥;
  • 子密钥不必一直保存在 TPM 内部。它可以作为受保护的 Blob 存放在外部,重新加载时由父密钥解密并验证完整性。沿着父子关系向上追溯,最终会回到 SRK。

这种父子关系描述的是密钥的存储和保护方式,本身并不是一条证书签名链。如果远端服务需要确认某个新的 AK 与 EK 位于同一个 TPM 中,可以使用下文介绍的 Credential Activation。

Attestation Key

Attestation Key(AK)是一种用于对 TPM 内部数据进行签名的密钥,具有以下关键特性:

  • non-duplicable(不可复制):AK 是由 TPM 内部直接生成的,并且密钥材料不会暴露给 TPM 外部,这确保了其私钥无法被导出或复制,增强了安全性。
  • Restricted(受限用途):AK 只能用于对 TPM 生成的数据进行签名或解密,例如 PCR(平台配置寄存器)值。它不能用于任意数据的签名或加密,以防止其被滥用为通用密钥。
  • 签名密钥,用于设备身份(DevID):AK 的公钥证书可以作为设备的身份凭据,由制造商或受信任方签发。

“The 802.1AR standard defines a secure device identifier (DevID) as “an identifier that is cryptographically bound to a device”.”

设备制造商在制造阶段创建的设备身份称为 IDevID/IAK,IDevID “Credential” 在设备整个生命周期内使用。用户在部署/应用阶段创建的设备身份称为 LDevID/LAK,LDevID “Credential” 会在设备复位或寿命结束时被移除。

“Credential is a combination of a private key and a certificate.”

Attestation Identity Key(AIK)是 TPM 1.2 中的一种密钥类型,AIK 仅被允许执行两种基于签名的操作:

  • TPM_Quote:使用 AIK 对 PCR 寄存器值进行签名,生成代表设备身份和当前状态的硬件报告,常用于远程证明场景,也就是向远端证明设备当前的可信状态。
  • TPM_CertifyKey:生成一个签名声明,用以证明另一个密钥(不是 AIK 本身)位于 TPM 的密钥存储体系中,且不可迁移(non-migratable)。显然,所认证的那个密钥必须实际具备这些属性。

Credential Activation

Credential activation 能够远程地建立对新密钥(例如,IAK)的信任,该密钥随后可以代表设备进行加密或证明,需要证明如下两点:

  • IAK(Identity Attestation Key)具备预期的密钥属性,例如:

    FlagFixedTPM             // 密钥不能被导出,必须留在 TPM 中;
    FlagSensitiveDataOrigin  // 密钥必须由 TPM 内部生成,而不是导入;
    
  • IAK 确实与 EK 存在于相同的 TPM 中。

Credential activation allows a remote party to verify one key is on the same TPM as another key, and that the key has a specific set of properties.

大概的流程如下:Activation key 代指 IAK,Anchor key 代指 EK。

    Figure 2. The Flow of Credential Activation
  • Client 将 EK 公钥和 IAK 的 Public Area 发送给 Server。Public Area 同时包含公钥和密钥属性;对其计算哈希可以得到 IAK Name;
  • Server 验证 IAK 的属性是否满足安全策略,生成秘密值和随机 Seed,然后构造 Challenge 并返回给 Client。可以将其简化为:

    encrypted_seed = Encrypt(EK_public, seed)
    symmetric_key  = KDF(seed, IAK_Name)
    credential     = EncryptAndAuthenticate(symmetric_key, secret, IAK_Name)
    challenge      = credential || encrypted_seed
    

    只有持有 EK 私钥的 TPM 才能恢复 Seed。IAK Name 同时参与密钥派生和完整性校验,因此,只要 IAK 公钥或密钥属性发生变化,TPM 的计算结果就无法匹配 Challenge。

  • Client 将 Challenge 以及 EK、IAK 的句柄发送给 TPM,调用 TPM2_ActivateCredential 命令;
  • TPM 使用 EK 恢复 Seed,再根据 Seed 和当前加载的 IAK Name 重新派生密钥,验证 Credential 并返回秘密值。成功返回意味着:这个具有指定公钥和属性的 IAK 与 EK 位于同一个 TPM 中。

Reference

  1. A Practical Guide to TPM 2.0
  2. Remote Attestation with tpm2-tss
  3. Credential Activation in go-attestation
  4. tpm.dev Tutorials