不幸的是,关于证明的事实并没有单一的来源。我会尽量说清楚,并在必要时引用。
TL;DR:背书密钥用于证明您正在与真正的 TPM 交谈。但是,它不能用于签名。AK 可用于签名并与 EK 关联。
背书密钥
您可以考虑每个 TPM 固定的背书密钥 (EK)。实际上,EK 是背书层次结构的主键。因此,它取决于在TPM 的生命周期内真正固定的背书主种子 (EPS) 和所谓的模板,例如确定 EK 是 RSA 还是 ECC 密钥。
EPS (random, can never be changed)
|
+-----+
template ->| KDF |
+-----+
|
V
EK
假设您使用默认模板,则 EK 是唯一的,并且对于 TPM 是不可更改的。你永远无法改变它。这引发了隐私问题,我将在后面介绍。另请注意,TPM 永远不会公开 EK 私钥。
此外,TPM 通常提供一个背书证书(链),该证书保存在 TPM 存储中(例如 ECC EK 证书:NV 索引0x01c0000a
,请参阅TCG EK 凭据配置文件)。此 EK 证书包含 EK 公钥并由制造商签名。使用该证书,您可以验证 EK 公钥是否与制造商生产的真正硬件 TPM相关联。
我之前提到过,公开 EK 公钥会侵犯我们的隐私(因为我们永远无法更改它)。因此,TPM 将不允许我们使用 EK 进行签名。这就是为什么我们需要一个证明密钥 (AK),以前也称为证明身份密钥 (AIK)。
存储根密钥
存储根密钥 (SRK) 很简单。它是所有者层次结构的主键,即“所有(普通)键之父”。TPM 所有者用于签名和加密的所有密钥通常与所有者层次结构相关联,因此与 SRK 的子代(或孙代等)相关联。事实上,作为 SRK 的子节点意味着在内部被 SRK 加密(=包装)。
证明密钥
现在是棘手的部分。证明密钥 (AK) 一词,以前的证明身份密钥 (AIK) 定义非常松散。基本上任何(受限)签名密钥都可以是 AK。
TPM 规范第 1 部分,25.3.1
在本规范中,有时将受限签名密钥称为证明或证明密钥。
AK 的目的是对数据(例如 PCR 值)进行签名,以证明它们来自真实的 TPM(没有被篡改)。请记住,我们不能直接使用 EK 进行签名。
我知道有两种类型的AK。
AK 带 AK 证书
首先, TPM Spec Part 1, 9.5.3.1中指定的 AK 。基本上,有一个名为 Attestation CA 的可信第三方,它拥有自己的根密钥和根证书。证明 CA 会 a) 通过其 EK 证书验证 TPM 是否是真实的,并且 b) 如果 TPM 是真实的,则颁发 AK 证书。
现在,不同的 AK 及其对应的 AK 证书可用于不同服务(例如 Google、Facebook)的证明。服务提供商使用 Attestation CA 根证书来验证 TPM 是否真实。
称为“证明 CA”的外部实体证明 TPM 中的非对称密钥对 [ AK ],以保证密钥受身份不明但真实的 TPM 保护并具有特定属性。此证明采用凭证 [ AK 证书] 的形式,用于保证包括密钥对的公钥在内的信息。
通常,这种类型的 AK 与所有者层次结构相关联,因此是 SRK 的子(或孙等)。
我认为本教程可能会有所帮助。
与背书层次结构相关的 AK
AK 有第二种方法。正如我所解释的,EK 不能直接用于签名。但是,它可以用于包装(=加密)其他密钥。因此,您可以创建与背书层次结构关联的签名密钥 (AK)。
同样,服务提供商需要一种机制来证明 TPM 与良好的 EK/EK 证书相关联。在这种情况下,使用的 AK 由 EK 加密(= 包装)。只有当 TPM 可以在其唯一的 EK 下加载(=解密)AK 并使用它来签署数据时,它才是真正的 TPM。在这种情况下,TPM 失去了匿名性,因为服务提供商需要知道它的 EK。
Matthew Garrett 在 LCA 2020 的这次演讲中简要描述了这种方法。