列出 TPM 2.0 芯片的内容

列出 TPM 2.0 芯片的内容

我想按类型列出存储在 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-persistenttpm2_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 本身作为对象进行管理,但不能将其内容进行管理。

相关内容