TPM 密钥证明

适用范围:Windows Server 2022、Windows Server 2019、Windows Server 2016、Windows Server 2012 R2、Windows Server 2012

作者:Justin Turner,Windows 组的高级支持升级工程师

注意

本内容由 Microsoft 客户支持工程师编写,适用于正在查找比 TechNet 主题通常提供的内容更深入的有关 Windows Server 2012 R2 中的功能和解决方案的技术说明的有经验管理员和系统架构师。 但是,它未经过相同的编辑审批,因此某些语言可能看起来不如通常在 TechNet 上找到的内容那么精练。

概述

虽然自 Windows 8 以来就一直支持受 TPM 保护的密钥,但没有任何机制能够让 CA 以加密方式证明证书请求者私钥实际得到受信任的平台模块 (TPM) 的保护。 此项更新使 CA 能够执行这种证明,并在颁发的证书中反映这种证明。

注意

本文假设读者熟悉证书模板的概念(有关参考信息,请参阅证书模板)。 它还假设读者熟悉如何配置企业 CA,以根据证书模板颁发证书(有关参考信息,请参阅清单:配置 CA 以颁发和管理证书)。

术语

术语 定义
EK 认可密钥。 这是包含在 TPM 中的非对称密钥(在制造时注入)。 EK 对于每个 TPM 都是唯一的,并可以标识 TPM。 无法更改或删除 EK。
EKpub 指 EK 的公钥。
EKPriv 指 EK 的私钥。
EKCert EK 证书。 TPM 制造商为 EKPub 颁发的证书。 并非所有 TPM 都有 EKCert。
TPM 受信任的平台模块。 TPM 旨在提供基于硬件的安全相关功能。 TPM 芯片是安全加密处理器,旨在执行加密操作。 该芯片包含多个物理安全机制以使其防篡改,并且恶意软件无法篡改 TPM 的安全功能。

背景

从 Windows 8 开始,受信任的平台模块 (TPM) 可用于保护证书的私钥。 Microsoft 平台加密提供程序密钥存储提供程序 (KSP) 可以实现此功能。 在实现中需要注意两个问题:

  • 不保证密钥实际上受到 TPM 的保护(恶意用户可以使用本地管理员凭据轻松将软件 KSP 伪装成 TPM KSP)。

  • 无法限制可以保护企业颁发证书的 TPM 的列表(如果 PKI 管理员想要控制可用于在环境中获取证书的设备类型)。

TPM 密钥证明

TPM 密钥证明是请求证书的实体以加密方式向 CA 证明其证书请求中的 RSA 密钥受该 CA 信任的“某一个”或“指定的那一个”TPM 保护的功能。 本文稍后的部署概述部分将详细讨论 TPM 信任模型。

为何 TPM 密钥证明非常重要?

具有 TPM 证明密钥的用户证书提供更好的安全保证,并有 TPM 提供的密钥不可导出性、防攻击和隔离作为后盾。

借助 TPM 密钥证明,现在可以实现新的管理范式:管理员可以定义可供用户用来访问企业资源(例如 VPN 或无线接入点)的设备集,并可靠地保证无法使用其他设备来访问这些资源。 这种新的访问控制范式非常可靠,因为它与硬件绑定用户标识相关联,而这种标识比基于软件的凭据更可靠。

TPM 密钥证明的工作原理是怎样的?

一般情况下,TPM 密钥证明基于以下支柱:

  1. 每个 TPM 附带由制造商刻录的唯一非对称密钥,称为认可密钥 (EK)。 我们将此密钥的公钥部分称为 EKPub,将关联的私钥称为 EKPriv。 某些 TPM 芯片还具有 EKPub 制造商颁发的 EK 证书。 我们将此证书称为 EKCert。

  2. CA 通过 EKPub 或 EKCert 在 TPM 中建立信任。

  3. 用户向 CA 证明请求证书的 RSA 密钥以加密方式关联到 EKPub,并且该用户拥有 EKpriv。

  4. CA 颁发具有特殊颁发策略 OID 的证书来表示现已证明密钥受 TPM 保护。

部署概述

假设在此部署中设置了 Windows Server 2012 R2 企业 CA。 此外,客户端 (Windows 8.1) 配置为使用证书模板对该企业 CA 进行注册。

部署 TPM 密钥证明需要完成三个步骤:

  1. 规划 TPM 信任模型:第一步是确定要使用哪种 TPM 信任模型。 可通过 3 种受支持的方法做出此决定:

    • 基于用户凭据的信任:企业 CA 信任用户提供的 EKPub 作为证书请求的一部分,并且除了用户的域凭据之外,不执行其他任何验证。

    • 基于 EKCert 的信任:企业 CA 根据管理员管理的可接受 EK 证书链列表,验证作为证书请求的一部分提供的 EKCert 链。 可接受的链是按制造商定义的,通过发证 CA 中的两个自定义证书存储表示(一个存储用于中间 CA 证书,另一个存储用于根 CA 证书)。 这种信任模式意味着来自给定制造商的所有 TPM 都受信任。 请注意,在此模式下,环境中使用的 TPM 必须包含 EKCert。

    • 基于 EKPub 的信任:企业 CA 验证作为证书请求的一部分提供的 EKPub 是否出现在管理员管理的允许 EKPub 列表中。 此列表表示为文件目录,此目录中每个文件的名称是允许的 EKPub 的 SHA-2 哈希。 此选项提供最高级别的保证,但需要更多的管理工作,因为每个设备是单独标识的。 在此信任模型中,只有其 TPM 的 EKPub 已添加到 EKPub 允许列表的设备才能注册 TPM 证明的证书。

    根据使用的方法,CA 将对颁发的证书应用不同的颁发策略 OID。 有关颁发策略 OID 的更多详细信息,请参阅本文的配置证书模板部分中的“颁发策略 OID”表。

    请注意,可以选择 TPM 信任模型的组合。 在这种情况下,CA 将接受任何证明方法,颁发策略 OID 将反映所有成功的证明方法。

  2. 配置证书模板:本文的部署详细信息部分介绍了如何配置证书模板。 本文不会介绍如何将此证书模板分配到企业 CA,或如何向一组用户授予注册访问权限。 有关详细信息,请参阅清单:配置 CA 以颁发和管理证书

  3. 为 TPM 信任模型配置 CA

    1. 基于用户凭据的信任:无需特定的配置。

    2. 基于 EKCert 的信任:管理员必须从 TPM 制造商获取 EKCert 链证书,并将其导入到管理员在执行 TPM 密钥证明的 CA 上创建的两个新证书存储中。 有关详细信息,请参阅本文中的 CA 配置部分。

    3. 基于 EKPub 的信任:管理员必须为每台需要 TPM 证明证书的设备获取 EKPub,并将其添加到允许的 EKPub 列表中。 有关详细信息,请参阅本文中的 CA 配置部分。

    注意

    • 此功能需要 Windows 8.1/Windows Server 2012 R2。
    • 不支持第三方智能卡 KSP 的 TPM 密钥证明。 必须使用 Microsoft 平台加密提供程序 KSP。
    • TPM 密钥证明仅适用于 RSA 密钥。
    • 独立 CA 不支持 TPM 密钥证明。
    • TPM 密钥证明不支持非永久性证书处理

部署详细信息

配置证书模板

若要为 TPM 密钥证明配置证书模板,请执行以下配置步骤:

  1. “兼容性”选项卡

    在“兼容性设置”部分:

    • 确保为“证书颁发机构”选择“Windows Server 2012 R2”。

    • 确保为“证书接收者”选择“Windows 8.1/Windows Server 2012 R2”。

    Screenshot that highlights the Certificate recipient list.

  2. “加密”选项卡

    确保为“提供程序类别”选择“密钥存储提供程序”,并为“算法名称”选择“RSA”。 确保选择“请求必须使用以下提供程序之一”,并在“提供程序”下选择“Microsoft 平台加密提供程序”选项。

    Screenshot that highlights the Provider Category and Algorithm name lists.

  3. “密钥证明”选项卡

    这是适用于 Windows Server 2012 R2 的新选项卡:

    Screenshot that shows the Key Attestation tab.

    从三个选项中选择一种证明模式。

    Screenshot that shows the attestation modes.

    • 无:表示不得使用密钥证明

    • 必需(如果客户端允许):允许不支持 TPM 密钥证明的设备上的用户继续注册该证书。 能够执行证明的用户将以特殊的签发策略 OID 进行区分。 某些设备可能无法执行证明,因为旧 TPM 不支持密钥证明,或者设备上根本没有 TPM。

    • 必需:客户端必须执行 TPM 密钥证明,否则证书请求将会失败。

    然后选择 TPM 信任模型。 又有三个选项:

    Screenshot that shows the TPM trust models.

    • 用户凭据:允许进行身份验证的用户通过指定其域凭据来保证 TPM 有效。

    • 认可证书:设备的 EKCert 必须通过管理员管理的 TPM 中间 CA 证书对管理员管理的根 CA 证书进行验证。 如果你选择此选项,则必须按照本文中的 CA 配置部分所述,在发证 CA 上设置 EKCA 和 EKRoot 证书存储。

    • 认可密钥:设备的 EKPub 必须出现在 PKI 管理员管理的列表中。 此选项提供最高级别的保证,但需要更多的管理工作。 如果你选择此选项,则必须按照本文中的 CA 配置部分所述,在发证 CA 上设置 EKPub 列表。

    最后,确定要在颁发的证书中显示哪个颁发策略。 默认情况下,每个强制类型都有一个关联的对象标识符 (OID),如果该 OID 通过了该强制类型的验证,则将被插入到证书中,如下表中所述。 请注意,可以选择强制方法的组合。 在这种情况下,CA 将接受任何证明方法,颁发策略 OID 将反映所有成功的证明方法。

    颁发策略 OID

    OID 密钥证明类型 说明 保证级别
    1.3.6.1.4.1.311.21.30 EK “EK 已验证”:适用于管理员管理的 EK 列表
    1.3.6.1.4.1.311.21.31 认可证书 “EK 证书已验证”:验证 EK 证书链时 中型
    1.3.6.1.4.1.311.21.32 用户凭据 “EK 信任使用”:适用于用户证明的 EK

    如果选择了“包括颁发策略”(默认配置),则会将 OID 插入到颁发的证书中。

    TPM Key attestation

    提示

    证书中的 OID 的一种潜在用途是仅限特定的设备访问 VPN 或无线网络。 例如,如果证书中包含 OID 1.3.6.1.4.1.311.21.30,则访问策略可能允许连接(或访问其他 VLAN)。 这样,就可以仅限其 TPM EK 包含在 EKPUB 列表中的设备进行访问。

CA 配置

  1. 在发证 CA 上设置 EKCA 和 EKROOT 证书存储

    如果为模板设置选择了“认可证书”,请执行以下配置步骤:

    1. 使用 Windows PowerShell 在要执行 TPM 密钥证明的证书颁发机构 (CA) 服务器上创建两个新的证书存储。

    2. 从制造商那里获取你要在企业环境中允许的中间和根 CA 证书。 必须相应地将这些证书导入到先前创建的证书存储(EKCA 和 EKROOT)中。

    以下 Windows PowerShell 脚本执行这两个步骤。 在以下示例中,TPM 制造商 Fabrikam 提供了根证书 FabrikamRoot.cer 和发证 CA 证书 Fabrikamca.cer。

    PS C:>\cd cert:
    PS Cert:\>cd .\\LocalMachine
    PS Cert:\LocalMachine> new-item EKROOT
    PS Cert:\ LocalMachine> new-item EKCA
    PS Cert:\EKCA\copy FabrikamCa.cer .\EKCA
    PS Cert:\EKROOT\copy FabrikamRoot.cer .\EKROOT
    
  2. 在使用 EK 证明类型的情况下设置 EKPUB 列表

    如果在模板设置中选择了“认可密钥”,接下来的配置步骤是在发证 CA 上创建并配置一个文件夹,其中包含 0 字节文件,每个文件以允许的 EK 的 SHA-2 哈希命名。 此文件夹用作有权获取 TPM 密钥证明证书的设备的“允许列表”。 因为必须为每台需要证明证书的设备手动添加 EKPUB,因此这样可以保证企业中的设备有权获取 TPM 密钥证明的证书。 需要执行两个步骤来为此模式配置 CA:

    1. 创建 EndorsementKeyListDirectories 注册表项:使用 Certutil 命令行工具配置文件夹位置,将在其中按下表所述定义受信任的 EKpub。

      操作 命令语法
      添加文件夹位置 certutil.exe -setreg CA\EndorsementKeyListDirectories +"<folder>"
      删除文件夹位置 certutil.exe -setreg CA\EndorsementKeyListDirectories -"<folder>"

      certutil 命令中的 EndorsementKeyListDirectories 是下表中所述的一个注册表设置。

      值名称 类型 数据
      EndorsementKeyListDirectories REG_MULTI_SZ EKPUB 允许列表的本地或 UNC 路径<>

      例如:

      \\blueCA.contoso.com\ekpub

      \\bluecluster1.contoso.com\ekpub

      D:\ekpub

      HKLM\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\<CA Sanitized Name>

      EndorsementKeyListDirectories 将包含 UNC 或本地文件系统路径的列表,每个路径指向 CA 拥有读取权限的文件夹。 每个文件夹都可以包含零个或零个以上的允许列表条目,其中的每个条目都是一个文件,该文件的名称是受信任 EKpub 的 SHA-2 哈希,没有文件扩展名。 创建或编辑此注册表项配置需要重启 CA,就如同编辑现有的 CA 注册表配置设置后一样。 但是,对该配置设置的编辑会立即生效,不需重启 CA。

      重要

      通过配置权限来保护列表中的文件夹免遭篡改和未经授权的访问,以便只为已授权的管理员提供读取和写入访问权限。 CA 的计算机帐户只需要读取访问权限。

    2. 填充 EKPUB 列表:在每台设备上使用以下 Windows PowerShell cmdlet 获取 TPM EK 的公钥哈希,然后将此公钥哈希发送到 CA 并将其存储在 EKPubList 文件夹中。

      PS C:>\$a=Get-TpmEndorsementKeyInfo -hashalgorithm sha256
      PS C:>$b=new-item $a.PublicKeyHash -ItemType file
      

疑难解答

证书模板上的密钥证明字段不可用

如果模板设置不符合证明的要求,则密钥证明字段不可用。 常见原因:

  1. 未正确配置兼容性设置。 确保按如下所述配置兼容性设置:

    1. 证书颁发机构:Windows Server 2012 R2

    2. 证书接收者:Windows 8.1/Windows Server 2012 R2

  2. 未正确配置加密设置。 确保按如下所述配置兼容性设置:

    1. 提供程序类别:密钥存储提供程序

    2. 算法名称:RSA

    3. 提供程序:Microsoft 平台加密提供程序

  3. 未正确配置请求处理设置。 确保按如下所述配置兼容性设置:

    1. 不能选择“允许导出私钥”选项。

    2. 不能选择“存档使用者的加密密钥”选项。

验证用于证明的 TPM 设备

使用 Windows PowerShell cmdlet Confirm-CAEndorsementKeyInfo 验证 CA 是否信任特定的 TPM 设备进行证明。 有两个选项:一个用于验证 EKCert,另一个用于验证 EKPub。 该 cmdlet 可以在 CA 本地运行,也可以使用 Windows PowerShell 远程处理在远程 CA 上运行。

  1. 若要验证对 EKPub 的信任,请执行以下两个步骤:

    1. 从客户端计算机中提取 EKPub:可以通过 Get-TpmEndorsementKeyInfo 从客户端计算机中提取 EKPub。 在提升的命令提示符下运行以下命令:

      PS C:>\$a=Get-TpmEndorsementKeyInfo -hashalgorithm sha256
      
    2. 在 CA 计算机上验证对 EKCert 的信任:将提取的字符串(EKPub 的 SHA-2 哈希)复制到服务器(例如,通过电子邮件),并将其传递给 Confirm-CAEndorsementKeyInfo cmdlet。 请注意,此参数必须为 64 个字符。

      Confirm-CAEndorsementKeyInfo [-PublicKeyHash] <string>
      
  2. 若要验证对 EKCert 的信任,请执行以下两个步骤:

    1. 从客户端计算机中提取 EKCert:可以通过 Get-TpmEndorsementKeyInfo 从客户端计算机中提取 EKCert。 在提升的命令提示符下运行以下命令:

      PS C:>\$a=Get-TpmEndorsementKeyInfo
      PS C:>\$a.manufacturerCertificates|Export-Certificate -filepath c:\myEkcert.cer
      
    2. 在 CA 计算机上验证对 EKCert 的信任:将提取的 EKCert (EkCert.cer) 复制到 CA(例如,通过电子邮件或 xcopy)。 例如,如果将证书文件复制到 CA 服务器上的“c:\diagnose”文件夹中,请运行以下命令以完成验证:

      PS C:>new-object System.Security.Cryptography.X509Certificates.X509Certificate2 "c:\diagnose\myEKcert.cer" | Confirm-CAEndorsementKeyInfo
      

另请参阅

受信任的平台模块技术概述外部资源:受信任的平台模块