文章参考了微软的TPM 密钥证明
每一个TPM在生产时,都会注入一个EK (Endorsement Key)密钥对。EK 对于每个 TPM 都是唯一的,不能更改或删除 EK。EK是一个模长为2048比特的RSA公私钥对,私钥保存在TPM内部,永远不会暴露在TPM之外。
Term | Definition |
---|---|
EK | Endorsement Key. This is an asymmetric key contained inside the TPM (injected at manufacturing time). The EK is unique for every TPM and can identify it. The EK cannot be changed or removed. |
EKpub | Refers to public key of the EK. |
EKPriv | Refers to private key of the EK. |
EKCert | EK Certificate. A TPM manufacturer-issued certificate for EKPub. Not all TPMs have EKCert. |
TPM | Trusted Platform Module. A TPM is designed to provide hardware-based security-related functions. A TPM chip is a secure crypto-processor that is designed to carry out cryptographic operations. The chip includes multiple physical security mechanisms to make it tamper resistant, and malicious software is unable to tamper with the security functions of the TPM. |
TPM 密钥证明是指 请求证书 以加密方式向 CA 证明,证书请求中的 RSA 密钥受 CA 信任的TPM 保护的能力。
TPM密钥证明工作方式:
1. 每个 TPM 出厂时都带一个唯一的非对称密钥对(称为 认可密钥 EK),EK的公钥称为EKPub, 私钥称为EKPriv. 有些TPM芯片还具有制造商为EKPub颁发的EK证书,此证书称为EKCert。
2. CA通过TPM中的EKPub或EKCert建立信任。
3. 用户向CA证明,为其请求证书的RSA密钥与EKPub加密相关,并且用户拥有EKpriv。
4. CA颁发带有特殊颁发策略OID的证书,以表示该密钥现在已被证明受TPM保护。
部署 TPM 密钥证明有三个步骤:
1.TPM 信任模型
基于用户凭据的信任
企业 CA 相信用户提供的 EKPub 作为证书请求的一部分,而不执行除用户域凭据以外的任何验证。
基于 EKCert 的信任
企业CA会根据管理员管理的可接受EK证书链列表来验证作为证书请求的一部分提供的EKCert链。可接受的链是按制造商定义的,并通过CA上的两个自定义证书存储区(一个存储为中间证书存储区,一个存储为根CA证书)来表示。 此信任模式意味着来自给定制造商的所有TPM都是可信的。 在这种模式下,环境中使用的TPM必须包含EKCert。
基于 EKPub 的信任
企业 CA 验证作为证书请求的一部分提供的 EKPub 是否显示在管理员托管的允许 EKPubs 列表中。 此列表表示为文件目录,其中每个文件的名称都是允许的 EKPub 的 SHA-1 哈希。 此选项可提供最高的保障级别,但需要更多管理工作,因为每个设备单独标识。 在此信任模式下,仅允许已将其 TPM EKPub 添加到 EKPubs 允许列表的设备注册证明证书。
根据所使用的方法,CA 会将不同的颁发策略 OID 应用于颁发的证书。请注意,可以选择 TPM 信任模型的组合。 在这种情况下,CA 将接受任何证明方法,并且颁发策略 Oid 将反映所有成功的证明方法。
2. 配置证书模板
3.为 TPM 信任模型配置 CA
基于用户凭据的信任: 不需要特定的配置。
基于 EKCert 的信任: 管理员必须从 TPM 制造商处获取 EKCert 链证书,并将其导入到在执行 TPM 密钥证明的 CA 上由管理员创建的两个新证书存储。
基于 EKPub 的信任: 管理员必须获取将需要 TPM 证明证书的每个设备的 EKPub,并将其添加到允许的 EKPubs 列表。
一、基于用户凭据的信任
配置证书模板, 此模板也将通过少许修改后作为EKCert和EKPub信任的证书模板。
- 从【证书模板控制台(certtmpl.msc)】中复制【工作站身份验证】模板
- <常规/General>页,设置模板名称,如:TPMKEYATTESTATION
- <兼容性/Compatibility>页,<证书颁发机构/ Certificate Authority>可以设置为”Windows Server 2012 R2”, 也可以设置为”Windows Server 2016”, 此处设置为后者;<证书接收人/ Certificate recipient>设置为“Windows 8.1/Windows Server 2012 R2”。
- <加密/Cryptography>页,<提供程序类别/Provider Category>选择 ”密钥存储提供程序“/”Key Storage Provider”; <算法名称/Algorithm name>选择 ”RSA”; <提供程序/Providers> 只选择 “Microsoft Platform Crypto Provider”。
- <密钥证明/Key Attestation>页,<密钥证明/Key Attestation>选择 “必需(如果客户端允许)”/”Required, if client is capable”;<根据以下条件执行证明/Key attestation type to enforce>选择“用户凭据”/”User credentials”; <密钥证明的证书分布策略/Issuance policies for key attested certificates> 选择 “包含强制实施的证明类型的颁发策略”/”Include issuance policies for enforced attestation types。
-
应用并保存模板。打开【证书颁发机构(certsrv.msc) / Certificate Authority】,右键<证书模板>新建一个证书模板。在启用证书模板中选择刚才建立的 “TPMKEYATTESTATION”
密钥证明说明:
- 无: 表示不得使用密钥证明
- 如果客户端支持,则需要: 允许设备上不支持 TPM 密钥证明的用户继续注册该证书。 可以执行证明的用户将与特殊的颁发策略 OID 区分开来。 某些设备可能无法执行证明,因为旧的 TPM 不支持密钥证明,或者设备根本没有 TPM。
- 必需: 客户端 必须 执行 TPM 密钥证明,否则证书请求将会失败
密钥证明类型说明:
- 用户凭据: 允许认证用户通过指定其域凭据来担保有效的TPM。
-
认可证书: 设备的 EKCert 必须通过管理员管理的 TPM 中间 CA 证书验证到管理员管理的根 CA 证书。 如果选择此选项,则必须在颁发 CA 上设置 EKCA 和 EKRoot 证书存储区.
-
认可密钥: 设备的 EKPub 必须出现在 "PKI 管理员管理" 列表中。 此选项提供最高的保障级别,但需要更多的管理工作量。 如果选择此选项,则必须在颁发 CA 上设置 EKPub 列表
最后,确定要在颁发的证书中显示的颁发策略。 默认情况下,每个强制类型都有一个关联的对象标识符 (OID) ,如果它传递该强制类型,它将插入证书,如下表所述。 请注意,可以选择强制方法的组合。 在这种情况下,CA 将接受任何证明方法,并且颁发策略 OID 将反映成功的所有证明方法。
OID | 密钥证明类型 | 说明 | 保证级别 |
1.3.6.1.4.1.311.21.30 | EK | "EK Verified": 适用于管理员托管的 EK 列表 | 高 |
1.3.6.1.4.1.311.21.31 | 认可证书 | "EK Certificate Verified":当对 EK 证书链进行验证时 | 中型 |
1.3.6.1.4.1.311.21.32 | 用户凭据 | "EK Trusted on Use":用于用户认证的EK | 低 |
客户端申请证书
用具有管理员权限的域帐户登入客户端,在【(证书)本地计算机 (certlm.msc)】的<个人>存储区新申请一个证书。在证书注册策略中选择”Active Directory注册策略/ Active Directory Enrollment Policy”, 下一步请求证书选择” TPMKEYATTESTATION”进行注册(Enroll)。成功后得到的证书:Endorsement Key Trusted on Use
可以通过以下命令验证证书:
Certutil -csp "Microsoft Platform Crypto Provider" -key
二、基于EKCert的信任
要使用EKCert信任,首先要确认TPM中包含有证书。
使用Get-TPMEndorsementKeyInfo查看本地TPM信息。 如下英飞凌的SLB9665在芯片中包含有证书,即EKCert, 此证书可以导出,然后在CA上面验证。从英飞凌网站下载中间证书时,要参考下面信息中的Issuer,找对应的证书。
1.证书导入
管理员必须从TPM 制造商处获取 EKCert 链证书,并将其导入到在执行TPM 密钥证明的CA上,由管理员创建的两个新证书存储区。
为了方便起见,Microsoft 发布了受信任的 TPM 根证书和中间证书的集合。 可以通过下面的链接下载到这些证书。如果以下包中未包含您的 TPM 证书,请与您的 TPM 供应商或服务器 OEM 联系,以获取特定 TPM 型号的根证书和中间证书。
从 https://go.microsoft.com/fwlink/?linkid=2097925 下载最新的包。
参考:https://docs.microsoft.com/zh-cn/windows-server/security/guarded-fabric-shielded-vm/guarded-fabric-install-trusted-tpm-root-certificates
从MS下载TrustedTpm.cab主要为了得到TPM供应商的根证书。供应商通常会将中间证书放在产品页面供下载,如英飞凌SLB9665的中间证书链接:
https://www.infineon.com/cms/en/product/promopages/optiga_tpm_certificates/#SLB9665xx2.0
从MS下载的TrustedTpm.cab中的安装脚本会在【(证书)本地计算机】中新建两个存储区:TrustedTpm_IntermediateCA 和 TrustedTpm_RootCA, 分别用于存储TPM供应商的RootCA和IntermediateCA。 可以选择需要的安装,不用全部安装所用TPM证书。针对TPM密钥证明测试,可以不执行MS的脚本,即不创建TrustedTpm_IntermediateCA 和 TrustedTpm_RootCA。 因为TPM密钥证明有专门的存储区EKROOT和EKCA。
通过PowerShell在CA服务器的【(证书)本地计算机】创建两个新的证书存储区:EKROOT和EKCA。 Windows Server 2016不会在控制台(certlm.msc)中显示EKCA对应的节点,会显示EKROOT对应的节点(认可密钥受信任的根证书颁发机构)。 Win10下两个节点都会显示:Endorsement Key Intermediate Certification Authorities 和 Endorsement Key Trusted Root Certification Authorities.
Powershell
Cd cert:
Cd .\\LocalMachine
New-item EKROOT //对应Endorsement Key Trusted Root Certification Authorities
New-item EKCA //对应Endorsement Key Intermediate Certification Authorities
Cd EKROOT
Import-Certificate path\to\“Infineon OPTIGA(TM) RSA Root CA.crt” -certstorelocation . //注意最后代表当前路径的“."
Cd ../EKCA
Import-Certificate path\to\“Infineon-OPTIGA-RSA-Manufacturing-CA 036_Issued_by_RootCA.crt-C-v01_00-EN”.crt -certstorelocation . //注意最后的“."
由于TPM供应商的根证书可能不被MS信任(如英飞凌的自签根证书),可以将rootca安装到<受信任的根证书颁发机构>。
2.模板修改
修改TPMKEYATTESTATION:
<密钥证明/Key Attestation>页,<密钥证明/Key Attestation>选择 “必需(如果客户端允许)”/”Required, if client is capable”;<根据以下条件执行证明/Key attestation type to enforce>选择“硬件证书”/” Endorsement Certificate”; <密钥证明的证书分布策略/Issuance policies for key attested certificates> 选择 “包含强制实施的证明类型的颁发策略”/”Include issuance policies for enforced attestation types”
重新发布证书模板,在客户端申请证书,得到的证书信息:Endorsement Key Certificate Verified
CA上添加TPM供应商的RootCA后,可以通过EKCert验证TPM设备,不需要向CA申请证书
Powershell
$a=Get-TpmEndorsementKeyInfo
$a.manufacturerCertificates|Export-Certificate -filepath D:\myEkcert.cer //导出TPM中的EKCert
net use p: \\democa\test "123" /user:test@democa //将导出的证书上传到CA
copy d:\myEkcert.cer p:
net use /d p:
Enter-PSSession -ComputerName democa -Credential (Get-Credential) //登入CA服务器
new-object System.Security.Cryptography.X509Certificates.X509Certificate2 "d:\myEKcert.cer" | Confirm-CAEndorsementKeyInfo
如果结果返回True则验证成功。
三、基于EKPub的信任
要使用EKPub验证,首先要将本地TPM中的PublicKeyHash保存到CA的允许的 EKPubs 列表。
1. 获取PublickKeyHash
客户端
Powershell
$a=Get-TpmEndorsementKeyInfo -hashalgorithm sha256
$b=new-item $a.PublicKeyHash -ItemType file //用PublicKeyHash为文件名创建一个文件
2.在CA上设置EKPUB List
在颁发 CA 上创建和配置一个文件夹,文件夹中的每个文件都命名为允许的 EK 的 sha-1 哈希。 此文件夹充当允许获取 TPM 密钥证明证书的设备的 "允许列表"。由于必须为每个需要证明证书的设备手动添加 EKPUB,因此它向企业提供了一个保证获得 TPM 密钥证明证书授权的设备。
创建 EndorsementKeyListDirectories 注册表项: 使用 Certutil 命令行工具配置受信任的 EKpubs 定义的文件夹位置
Operation | 命令语法 |
添加文件夹位置 | certutil.exe -setreg CA\EndorsementKeyListDirectories +" " |
删除文件夹位置 | certutil.exe -setreg CA\EndorsementKeyListDirectories -" " |
在CA上创建一个文件夹: D:\EKPUBLIST
certutil.exe -setreg CA\EndorsementKeyListDirectories +“D:\EKPUBLIST”
注意“+”或“-”后面不能有空格
对应的注册表路径为HKLM\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\EndorsementKeyListDirectories
EndorsementKeyListDirectories包含UNC或本地文件系统路径的列表,每个路径都指向CA具有读取访问权限的文件夹。 每个文件夹可能包含零个或多个允许列表条目,其中每个条目都是一个文件,该文件的名称是受信任的EKpub的SHA-2哈希,没有文件扩展名。
创建或编辑此注册表项配置需要重新启动CA服务。 向文件夹中添加哈希文件不需要重启CA服务。
net stop certsvc & net start certsvc
3.将HASH文件放置到D:\EKPUBLIST
net use p: \\democa\EKPUBLIST "123" /user:test@democa //将导出的证书上传到CA
copy $b p: //$b 为在第一步生成的hash文件
net use /d p:
4.修改证书模板
修改TPMKEYATTESTATION:
<密钥证明/Key Attestation>页,<密钥证明/Key Attestation>选择 “必需(如果客户端允许)”/”Required, if client is capable”;<根据以下条件执行证明/Key attestation type to enforce>选择“硬件密钥”/” Endorsement Key”; <密钥证明的证书分布策略/Issuance policies for key attested certificates> 选择 “包含强制实施的证明类型的颁发策略”/”Include issuance policies for enforced attestation types”
重新发布证书模板,在客户端申请证书,得到的证书信息:Endorsement Key Certificate Verified,Endorsement Key Verified.
尽管证书模板没有勾选“硬件证书”,但好像自动启用了硬件证书(EKCert)验证.
CA上添加TPM供应商的RootCA后,可以通过EKCert验证TPM设备,不需要向CA申请证书
Powershell
$a=Get-TpmEndorsementKeyInfo -hashalgorithm sha256
$b=new-item $a.PublicKeyHash -ItemType file //用PublicKeyHash为文件名创建一个文件
net use p: \\democa\EKPUBLIST "123" /user:test@democa //将导出的证书上传到CA
copy $b p: //$b 为在第一步生成的hash文件
net use /d p:
Enter-PSSession -ComputerName democa -Credential (Get-Credential) //登入CA服务器
$a=(ls d:\EKPUBLIST).name //假定EKPUBLIST只有刚上传的文件
Confirm-CAEndorsementKeyInfo $a
如果结果返回True则验证成功。