我确实有一个提供商抱怨我们几个 Windows 服务器系统(2008、2012、2016、2019)上的受信任根证书已过期。我无法证明相反的情况。可以肯定的是,这些系统上都没有配置“关闭自动证书更新”,因此应该更新根存储。
第一个问题: 无论如何,有没有简单的自动化方式(或者甚至是一个巧妙的工具)比较Windows 系统上实际安装的受信任根证书是否与互联网上最新的受信任根证书相符?
我可以
- 使用“certutil -generateSSTFromWU WURoots.sst”下载最新的根证书
- 使用 PowerShell *CERT* 命令做一些神奇的事情(参见“Get-Command *CERT*”)
- 比较序列号、指纹等。
然而,我并不是真正的程序员。
也许有一个工具可以满足我的需要?
第二个问题: 除了比较之外,有没有简单的方法可以强制根证书更新?是的,我可以这样做
- certutil-generateSSTFromWU WURoots.sst
- 选择我需要的证书并将其导出到自己的 .sst 文件中
- 使用导入证书(或通过 GPO 分发)
肯定存在一种不太复杂且更自动化的方法吗?
谢谢丹
答案1
默认情况下,根证书通过以下方式自动更新Windows更新。
您可能已通过 GPO 在您的环境中禁用此功能?您可以检查下面的键是否已设置,但默认情况下不存在:
Get-ItemProperty HKLM:\Software\Policies\Microsoft\SystemCertificates\AuthRoot -Name DisableRootAutoUpdate
它还需要针对 2008/2012 进行某些更新,例如KB3004394,因此请确保您总体上了解最新情况。
我不建议手动管理根证书,但你可以使用证书提供商如:
Get-ChildItem -Path Cert:\LocalMachine\CA\
也许您想将本地证书与远程机器进行比较:
# Get the list of local root/CA certificates
$localCerts = (Get-ChildItem -Path Cert:\LocalMachine\CA\)+(Get-ChildItem -Path Cert:\LocalMachine\Root\)
# Compare to the same certificates on a remote server
$result = Invoke-Command -ComputerName 'Server01' -ScriptBlock {
$remoteCerts = (Get-ChildItem -Path Cert:\LocalMachine\CA\)+(Get-ChildItem -Path Cert:\LocalMachine\Root\)
Compare-Object $using:localCerts $remoteCerts -Property thumbprint -PassThru
}
# Display certificates that don't match
$result | select SideIndicator,Thumbprint,FriendlyName,Subject
下面是 win10 和 Server 2016 之间的比较示例。您可以看到其中一个区别是我的本地机器有一个它信任的 TPM 模块:
SideIndicator Thumbprint Subject
------------- ---------- -------
=> DE28F4A4FFE5B92FA3C503D1A349A7F9962A8212 CN=GeoTrust Global CA, O=GeoTrust Inc., C=US
<= D4FFDB19BA590FFFAA34DB5F4B568706A2978436 CN=Microsoft TPM Root Certificate Authority 2014, O=Microsoft Corporation, L=Redmond, S=Washin...