windows - 如何确保在 TPM 中创建密钥?
问题描述
我需要
- 在客户端计算机上运行 .exe,这将在 TPM 中创建密钥对。
- 然后我将使用 TPM 生成的密钥对的公钥部分创建 CSR。
我担心的是如何确保密钥是在 TPM 内部创建的,而不是通过欺骗的 TPM 创建的。这将使私钥能够被迁移和复制。
我听说这就是 AIK 的用途,但我不明白这如何防止 TPM 被欺骗?
我能想到的一种解决方案是:我去客户端,使用受信任的操作系统从 USB 引导,然后获取 EKpub。
解决方案
证明密钥源自 TPM 的过程称为:
- 对于 TPM 2.0:凭据激活,强制执行
TPM2_ActivateCredential
- 对于 TPM 1.2:身份激活,强制执行
TPM_ActivateIdentity
这种技术可以完成很多事情,但其中之一是证明向 TPM 发出请求后生成的密钥实际上来自受信任的 TPM,并且没有被欺骗。对于 TPM 1.2,由于这就是问题所在,身份激活是一个 8 步过程,如下所示(以下是 TCG 的AIK 证书注册的摘录):
第 1 步:平台要求 TPM 创建 AIK 密钥对。
- (a) 平台(或平台上的应用软件)向 TSS 发出
CollateIdentityRequest
命令。反过来,TSSMakeIdentity
向 TPM 发出命令。这会导致 TPM 生成新的 AIK 公钥对。- (b) 在
MakeIdentity
函数内,TPM 创建IDENTITY_CONTENTS
包含以下项目的结构:(i) 结构版本,(ii) TPM 命令序号,(iii)PrivCADigest
标签和 (iv)AIK_pub_key
。- (c) TPM
IDENTITY_CONTENTS
使用 签名结构AIK_priv_key
,生成的签名部分称为identityBinding
。- (d) 作为
MakeIdentity
命令的结果,TPM 输出两 (2) 项:AIK_pub_key
和identityBinding
.第 2 步:TSS 生成有关 AIK 的证明结构
- (a) 在上一步之后,TSS 创建
IDENTITY_PROOF
结构。该结构由以下项目组成: (i)identityBinding
来自步骤 1(d) 的结构。(注意:identityBinding
结构只是结构上的签名部分IDENTITY_CONTENTS
)。注意:必须注意,该identityBinding
结构不是 AIK 是 TPM 驻留密钥以及 AIK 已使用 EK 认证的加密证明。它仅表明存在某些密钥对。(ii) TPM 规范版本 (iii)SubjectPublicKeyInfo
(即AIK_pub_key
) (iv)IdentityLabel
(v) EK 证书 (vi) 平台证书- (b) TSS 然后生成一个对称密钥
K1
(来自 TPM 的本地随机数)并IDENTITY_PROOF
使用这个对称密钥加密结构K1
。- (c) TSS 然后
K1
使用 ACA 的公钥加密密钥。这种使用认证 CA 的公钥的加密旨在限制K1
仅向 ACA 披露。这一步的结果是两项:加密IDENTITY_PROOF
结构和加密对称密钥K1
。加密IDENTITY_PROOF
和加密K1
被捆绑到一个IDENTITY_REQ
结构中,该结构包括用于加密结构的对称和非对称算法的标识符以及加密结构的大小。- 步骤 3:平台向 ACA 发送 AIK 证书请求。平台(或平台上的应用软件)获取
IDENTITY_REQ
上一步的结果,对其进行加密,并将其发送给 ACA。- 第 4 步:ACA 验证证书请求。收到证书请求后,ACA 必须执行多项验证。
- (a) 要访问 AIK 证书请求结构,ACA 必须首先
K1
使用其 ACA 私钥解密密钥。- (b) 然后 ACA
K1
用来解密IDENTITY_PROOF
结构。- (c) 然后 ACA 必须重新创建
IDENTITY_CONTENTS
结构并验证签名(由接收到的 表示identityBinding
)是否正确。ACA 可以执行验证,因为它现在具有上面步骤 2 中列出的项目,并且可以组装PrivCADigestLabel
提供给 TPM 的相同项目。作为验证的一部分,ACA 应验证收到的证书(即 EK 和平台证书)。预计 ACA 将使用标准 X.509 证书验证技术,例如 CRL 检查 [14] 和/或向 EK 证书颁发者(例如 TPM 制造商站点)查询适当的 OCSP 响应者 [15]。- 第 5 步:ACA 颁发新的 AIK 证书。然后,ACA 使用上一步中收到的 AIK 公钥(作为公钥)创建一个新的 AIK 证书。ACA 使用自己的 AIK 签名密钥颁发(签名)新的 AIK 证书。
- 第 6 步:ACA 加密新的 AIK 证书。在此阶段,ACA 必须以 TPM 可识别的形式准备新颁发的 AIK 证书。作为
TPM_ActivateIdentity
命令的一部分([5] 的第 15.2 节),TPM 期望输入TPM_EK_BLOB
或(旧规范版本)ASYM_CA_CONTENTS
结构。ACA 执行以下任务:
- (a) ACA 生成随机对称加密密钥
K2
。这个随机K2
对于每个 AIK 证书请求都是唯一的。- (b) ACA 使用 key 加密新的 AIK 证书
K2
。- (c) ACA 然后创建一个
TPM_EK_BLOB
或ASYM_CA_CONTENTS
(取决于 TPM 版本)结构,其中包含以下内容: (i) AIK 公钥的散列(即在原始请求中找到的 AIK 公钥)。(ii) 对称密钥K2
。(iii) 可选的 PCR 信息——仅供TPM_EK_BLOB
参考。TPM 检查以确保 TPM PCR 和位置处于 ACA 预期解锁的正确状态K2
。- (d) ACA使用 EK 公钥(在原始请求中的 EK 证书中找到)加密
TPM_EK_BLOB
或结构。ASYM_CA_CONTENTS
最后一步的目的是确保只有同一个请求 TPM 将是唯一可以解密新颁发的 AIK 证书的实体,因为只有 TPM 拥有 EK 私钥(这是 TPM 驻留密钥)。- 第 7 步:ACA 将新的 AIK 证书交付给平台上的 TPM。然后,ACA 将加密结果(加密的 AIK 证书 + blob 或 ASYM 结构)传递给请求者平台/TPM。
- 第 8 步:由 TPM 解密新的 AIK 证书。在收到来自 ACA 的(加密的)AIK 证书后,平台必须输入结构(blob 或 ASYM 结构)(进入 TPM 并使用 TSS
Tspi_TPM_ActivateIdentity
命令激活它。此命令K2
从 ACA解密(加密的)对称密钥在确保具有匹配 pub 密钥的 AIK 驻留在 TPM 中后,使用 EK-private-key(仅驻留在 TPM 中),然后使用对称密钥K2
解密 AIK 证书。
这里的关键部分是倒数第二句话:
在确保具有匹配公钥的 AIK 驻留在 TPM 中之后,此命令使用 EK-private-key(仅驻留在 TPM 中)从 ACA 解密(加密的)对称密钥 K2 。
规范强制要求 EK 不会解密TPM_EK_BLOB
对象,除非在 TPM 中找到请求激活的私钥。并且由于对象是由 TSS 加密的,没有使用 TPM 机密,并且您已经在制造商的 CA 证书链上验证了 EK 公钥,因此可以确保请求身份激活的密钥源自由制造的 TPM一个受信任的实体。
推荐阅读
- sqlite - 使用 Jetbrains 的 Datagrip 时如何保存 sqlite 数据库
- javascript - Tone.js 完全停止所有播放声音
- javascript - 如何用子元素的高度更新一个元素的高度
- angular - 商店中的角度测试流
- python - 绘制每个标准
- sql - 在sql中用不同的标签标记值
- linux - 将外部变量注入 Linux shell 脚本并通过 SSH 执行代码的最安全方法是什么?
- typescript - 如何在模块中使构造函数私有但仍允许外部构造
- vhdl - Xilinx ISE 14.5 不要求提供 .ucf 文件,并且可能不会读取它
- json - NestJS - 在请求正文中接受多种 MIME 类型