在公司,我们从未真正关心过根证书,并且认为这是与 Windows 更新一起管理的东西(并且有 WSUS 用于此),并且一切都很好。
然而,今天,我注意到,全新安装的 Windows Server 2016(包含所有更新)似乎只有非常非常基本的根证书,以至于我甚至无法打开 Google(因为不信任他们的证书)。
(我还没有检查全新安装的 Windows 10...)
我对此有点困惑,因为以前没有发生过这种情况。要么是我们对 GPO 做了一些糟糕的更改(虽然我想不出有什么会产生这种影响),要么这是最近更改的?我应该怎么做才能顺利访问 Google 之类的东西?我现在需要通过 GPO 手动添加受信任的证书吗?
以下是新安装的服务器上的一些情况的屏幕截图。
答案1
这是正常的,也是预期的行为。默认情况下,受信任的根存储中仅显示少数所需证书。其余证书(大约有 300 个根)在您第一次遇到它们时按需安装。Windows Crypt32.dll
Update 中和 Windows Update 上都有根证书的隐藏副本。无需担心。
更新:
我进行了内部检查,发现请求的根目录嵌入在crypt32.dll
文件中。以下是 PowerShell 代码,您可以从此 dll 中提取嵌入的证书并找到预期的根目录:
$signature = @"
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr LoadLibraryEx(
String lpFileName,
IntPtr hFile,
UInt32 dwFlags
);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr FindResource(
IntPtr hModule,
int lpID,
string lpType
);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern uint SizeofResource(
IntPtr hModule,
IntPtr hResInfo
);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr LoadResource(
IntPtr hModule,
IntPtr hResInfo
);
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool FreeLibrary(
IntPtr hModule
);
"@
Add-Type -MemberDefinition $signature -Namespace PKI -Name Kernel32
$path = $Env:SystemRoot + "\System32\crypt32.dll"
$hModule = [PKI.Kernel32]::LoadLibraryEx($path,[IntPtr]::Zero,0x2)
$hResInfo = [PKI.Kernel32]::FindResource($hModule,1010,"AUTHROOTS")
$size = [PKI.Kernel32]::SizeOfResource($hModule, $hResInfo)
$resource = [PKI.Kernel32]::LoadResource($hModule, $hResInfo)
$bytes = New-Object byte[] -ArgumentList $size
[Runtime.InteropServices.Marshal]::Copy($resource, $bytes, 0, $size)
$AUTHROOTS = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2Collection
$AUTHROOTS.Import($bytes)
[void][PKI.Kernel32]::FreeLibrary($hModule)
$AUTHROOTS | ?{$_.thumbprint -eq "75E0ABB6138512271C04F85FDDDE38E4B7242EFE"}
只需将此代码复制粘贴到 PS 控制台并检查是否返回任何对象/
答案2
如果系统可以访问 Internet 且该功能未被禁用,则受信任的根 CA 会自动更新。您还可以使用 certutil 下载受信任的根证书,将其发布到共享中,并创建组策略来指导系统从何处获取它们。
http://woshub.com/updating-trusted-root-certificates-in-windows-10/
Key: HKLM\Software\Policies\Microsoft\SystemCertificates\AuthRoot
Value: DisableRootAutoUpdate