TPM(可信平台模块)本质上并不会直接存储完整的密钥,而是持久化存储称为 Seed(种子)的秘密值,并通过这些 Seed 确定性地派生出各种密钥。两类常见的 Seed 和对应的密钥体系是 Endorsement 和 Stroage,如下所示:
| Seed 类型 | 密钥体系 | 用途简述 |
|---|---|---|
| Endorsement Seed | Endorsement Key(EK) | 识别 TPM 的密钥 |
| Storage Seed | Storage Root Key(SRK) | 本地应用使用的密钥 |
上述密钥按照用途分为两类: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。
- 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 中。