我想按类型列出存储在 TPM 芯片上的信息,只是为了查看在清除旧机器的 TPM 芯片之前所有相关数据是否都已迁移到新机器。我并不是想转储私钥等,只是想列出 ID 和用途(例如 Bitlocker 加密密钥、虚拟智能卡等)。在 Windows 和/或 Linux 中,这是否可行?
(我同时拥有 dTPM 和 fTPM 配置。)
答案1
不可能有完整的列表,因为这些数据实际上并没有存储在芯片。TPM 实际上几乎没有持久存储 - Windows 只在其中存储一个“存储根密钥”(即 SRK),其他所有内容都使用 SRK 进行加密,返回操作系统用于存储。
这意味着 TPM 完全不知道哪些内容已被删除,哪些内容仍存储在某个文件中。(这也意味着 TPM 永远不会像智能卡那样“填满”。)
例如,BitLocker“TPM”保护器仍存储在卷标头中,仅使用附加策略的 TPM_Seal() 或 TPM2_Create() 进行加密。每次需要解封保护器时,操作系统都必须将其重新加载到 TPM 的 RAM 中,TPM 会使用 SRK 对其进行解密,验证策略(如果需要,则比较 PCR 值),然后将清除数据返回给操作系统或拒绝。
因此,您无法列出所有使用特定 TPM 的 BitLocker 卷,因为该信息在任何地方都未被跟踪。(幸运的是,Windows 仅对 OS C:\ 卷使用 TPM 保护器,因此您可以放心地排除所有“数据”卷。)
Linux 中的 LUKS 使用了相同的方法,尽管直到最近 LUKS2 令牌格式才被“认可”——过去人们使用了各种手动编写的脚本,一些其中可能将密封数据直接存储在 TPM 的 NV 存储中。但是,由于 systemd 和 cryptsetup 现在已将 TPM 支持作为标准功能,因此密封的密钥槽始终会写回到 LUKS2 磁盘头中。
(以下是一个例子如何使用 TPM 2.0 密封 LUKS 密钥。带有“tpm2-blob”的 JSON 片段保存着 TPM 密封的数据。)
类似地,保存在 TPM“中”(通过“平台加密提供程序”KSP)的证书密钥对实际上存储在中
%USERPROFILE%\AppData\Local\Microsoft\Crypto\PCPKSP
,对于直接通过 CAPI/CNG 创建的密钥,存储在您自己的配置文件中,对于存储在 VSC 中的密钥,存储在 LocalService 配置文件中。(那只是私钥——与智能卡不同,证书本身从一开始就不会接触 TPM。当使用 VSC 时,它们存储在 VSC 的“模拟智能卡”存储中,该存储似乎位于
%SYSTEMROOT%\ServiceProfiles\LocalService\AppData\Local\Microsoft\Windows\SmartCard\Tpm
,而当使用直接 CNG 时,它们会去往所有其他证书所在的位置。)您可以使用它
certutil
来获取 CAPI 中所有证书及其使用的 KSP 的列表 - 查找“Microsoft Platform Crypto Provider”(直接 CNG)或“Microsoft Smart Card Provider”(VSC)来识别此类证书:certutil -store -silent -user My
没有直接的 Linux 等效物,因为 Linux 上首先没有 CAPI/CNG 等效物——程序可以使用 tpm2-pkcs11(将证书存储在 SQLite 数据库中),或使用 openssl-tpm2-engine 生成的 .pem 密钥(它们只是散布在各处的文件),甚至直接使用 tpm2-tss API。
话虽如此,TPM 2.0 确实有一些持久存储,尽管不太可能直接使用它,但您可以使用 Linuxtpm2-tools
尝试列出内容:
通常有 3 个左右的密钥对空间,可以使用这些密钥对列出
tpm2_getcap handles-persistent
(tpm2_readpublic -c <handle>
依次应用于每个显示的句柄)。通常,只有基于 RSA 的“存储根密钥”(用于加密数据)和“认可密钥”(用于识别 TPM 本身)存储在那里 - 并且后者无论如何都不会通过 TPM 清除进行重置。该句柄
0x81000001
最常用于基于 RSA 的 SRK,也0x81010001
最常用于基于 RSA 的 EK。有时您可能会0x81000000
在 Linux 上看到是否使用了较旧版本的 tpm2-pkcs11 工具。(Systemd LUKS 支持使用基于 ECDSA 的 SRK,并且不费心持久存储它 - 只是每次都从“存储层次结构种子”重新生成它。)
还有一定数量的通用“NV 存储”空间,可以使用
tpm2_getcap handles-nv-index
和列出tpm2_nvread
。在大多数情况下,它仅包含一些制造商预定义的数据,例如 EK 证书(位于 0x01C00002)。由于没有任何名称,因此您必须猜测 - 假设所讨论的 NV 索引首先是可读的。
答案2
这是不可能的,事实上这与 TPM 作为安全和不可侵犯的存储库的目的相悖。
微软文章 可信平台模块 列出用于管理 TPM 的 PowerShell 命令:
Clear-Tpm
:将 TPM 重置为其默认状态。ConvertTo-TpmOwnerAuth
:根据提供的字符串创建 TPM 所有者授权值。Disable-TpmAutoProvisioning
:禁用 TPM 自动配置。Enable-TpmAutoProvisioning
:启用 TPM 自动配置。Get-Tpm
:获取包含有关 TPM 信息的对象。Get-TpmEndorsementKeyInfo
:获取有关 TPM 的认可密钥和证书的信息。Get-TpmSupportedFeature
:验证 TPM 是否支持指定的功能。Import-TpmOwnerAuth
:将 TPM 所有者授权值导入到注册表。Initialize-Tpm
:执行 TPM 的部分配置过程。Set-TpmOwnerAuth
:更改 TPM 所有者授权值。Unblock-Tpm
:重置 TPM 锁定。
如您所见,我们可以将 TPM 本身作为对象进行管理,但不能将其内容进行管理。