TPM 2.0 芯片的列表内容

TFu*_*uto 5 tpm ftpm

我想按类型列出 TPM 芯片上存储的信息,只是为了查看在清除旧机器的 TPM 芯片之前所有相关数据是否已迁移到新机器。我不是在寻找转储私钥等,只是寻找 ID 和用途的列表(例如 Bitlocker 加密密钥、虚拟智能卡等)。在 Windows 和/或 Linux 中这是否可能?

(我有 dTPM 和 fTPM 配置。)

use*_*686 8

不可能有完整的列表,因为这些数据实际上根本没有存储芯片上。A\xc2\xa0TPM 实际上只有很少的持久存储 \xe2\x80\x93 Windows 仅在其中存储单个“存储根密钥”(也称为 SRK),其他所有内容都使用 SRK 进行加密并返回到操作系统进行存储。

\n

这意味着 TPM 完全不知道哪些内容已被删除以及哪些内容仍存储在某个文件中。(这也意味着 TPM 永远不会“填满”,与智能卡不同。)

\n
    \n
  • 例如,BitLocker“TPM”保护器仍存储在卷标头中,仅使用附加策略的 TPM_Seal() 或 TPM2_Create() 进行加密。每次需要启封保护器时,操作系统都必须将其加载回 TPM 的 RAM,其中 TPM 使用 SRK 对其进行解密,验证策略(如果需要,比较 PCR 值),然后返回明确的内容数据传输至操作系统或拒绝。

    \n

    因此,您无法列出使用特定 TPM 的所有 BitLocker 卷,因为不会在任何地方跟踪该信息。(幸运的是,Windows 仅对 OS C:\\ 卷使用 TPM 保护程序,因此您可以安全地排除所有“数据”卷。)

    \n

    Linux 中的 LUKS 使用相同的方法,尽管直到最近才“商定”LUKS2 令牌格式 \xe2\x80\x93 ,过去使用了各种手写脚本,其中一些可能将密封数据直接存储在 TPM 中的NV存储。然而,随着 systemd 和 cryptsetup 现在将 TPM 支持作为标准功能,密封的密钥槽始终会写回 LUKS2 磁盘标头。

    \n

    以下是如何使用 TPM 2.0 密封 LUKS 密钥的示例。带有“tpm2-blob”的 JSON 片段保存了 TPM 密封的数据。)

    \n
  • \n
  • 同样,保存在 TPM“中”(通过“平台加密提供商”KSP)的证书密钥对实际上存储在%USERPROFILE%\\AppData\\Local\\Microsoft\\Crypto\\PCPKSP您自己的配置文件中(对于直接通过 CAPI/CNG 创建的密钥),或者存储在 LocalService 配置文件中(对于存储在 VSC 中的密钥) 。

    \n

    (这只是私钥 \xe2\x80\x93 ,与智能卡不同,证书本身从一开始就不会接触 TPM。使用 VSC 时,它们存储在 VSC 的“模拟智能卡”存储中,似乎位于%SYSTEMROOT%\\ServiceProfiles\\LocalService\\AppData\\Local\\Microsoft\\Windows\\SmartCard\\Tpm,并且当使用直接 CNG 时,它们会转到所有其他证书所在的位置。)

    \n

    您可以使用certutil\xe2\x80\x93 来获取 CAPI 中所有证书以及它们使用的 KSP 的列表,查找“Microsoft Platform Crypto Provider”(直接 CNG)或“Microsoft Smart Card Provider”(VSC)认可此类证书:

    \n
    certutil -store -silent -user My\n
    Run Code Online (Sandbox Code Playgroud)\n

    没有直接的 Linux 等效项,因为 Linux 上首先没有 CAPI/CNG 等效项 \xe2\x80\x93 程序可以使用 tpm2-pkcs11(将证书存储在 SQLite 数据库中)或 .pem 密钥使用 openssl-tpm2-engine 生成(只是分散在各处的文件),甚至直接使用 tpm2-tss API。

    \n
  • \n
\n\n

话虽这么说,TPM 2.0 确实有一些持久存储,尽管不太可能直接使用它,但您可以使用 Linuxtpm2-tools尝试列出内容:

\n
    \n
  • 通常有空间容纳 3 个左右的密钥对,可以使用列出这些密钥对tpm2_getcap handles-persistenttpm2_readpublic -c <handle>依次应用于每个显示的句柄)。通常,只有基于 RSA 的“存储根密钥”(用于加密数据)和“认可密钥”(用于识别 TPM 本身)存储在 \xe2\x80\x93 中,而后者不会通过无论如何,TPM 很清楚。

    \n

    该句柄0x81000001最常用于基于 RSA 的 SRK、0x81010001基于 RSA 的 EK。有时您可能会0x81000000在 Linux 上看到是否使用了旧版本的 tpm2-pkcs11 工具。

    \n

    (Systemd LUKS 支持使用基于 ECDSA 的 SRK,并且不需要持久存储它 \xe2\x80\x93 只是每次从“存储层次结构种子”重新生成它。)

    \n
  • \n
  • 还有一些通用“NV 存储”空间,可以使用tpm2_getcap handles-nv-index和列出tpm2_nvread。在大多数情况下,它仅包含一些制造商预定义的数据,例如 EK 证书(位于 0x01C00002)。由于没有任何名称,您基本上必须猜测 \xe2\x80\x93 假设所讨论的 NV 索引首先是可读的。

    \n
  • \n
\n

  • @harrymc:从某种意义上说,如果没有 TPM,您就无法“使用”它,是的。 (如果从字面上理解,这句话没有任何意义,因为无法提取的证书将完全无用 - 拥有证书的全部意义在于您可以将其呈现给其他人,因此即使是公钥也必须不必保留 TPM 或智能卡,例如,以便首先对其进行签名以生成证书。)答案基于 TPM 2.0,而 MS 文章谈论的是 1.2,但两个变体中的情况基本相同。 (2认同)