Назад | Перейти на главную страницу

Отсутствуют корневые сертификаты в Windows Server 2016 (свежая установка)

В компании мы никогда особо не беспокоились о корневых сертификатах, и у нас сложилось впечатление, что это то, что управляется вместе с обновлениями Windows (и для этого есть WSUS), и все было хорошо.

Однако сегодня я заметил, что новая установка Windows Server 2016 со всеми обновлениями, похоже, имеет только ОЧЕНЬ основные корневые сертификаты до такой степени, что я даже не могу открыть Google (из-за того, что не доверяю их сертификату. ).

(Я еще не проверял свежую установку Windows 10 ...)

Меня это немного смущает, так как раньше такого не было. Либо мы внесли некоторые плохие изменения в наши объекты групповой политики (хотя я не могу придумать ничего, что могло бы иметь такой эффект), либо это что-то, что было недавно изменено? Как мне действовать, чтобы обеспечить беспрепятственный доступ к таким вещам, как Google? Нужно ли мне теперь вручную добавлять доверенные сертификаты через GPO?


Вот несколько скриншотов того, как выглядит ситуация при установке нового сервера.

Это нормальное и ожидаемое поведение. По умолчанию в доверенном корневом хранилище отображается только несколько необходимых сертификатов. Остальные (их около 300) устанавливаются по запросу, когда вы впервые сталкиваетесь с ними. Есть скрытая копия корневых сертификатов в Crypt32.dll и в Центре обновления Windows. Здесь не о чем беспокоиться.

Обновить:

Я провел внутреннюю проверку и обнаружил, что запрошенный корень встроен в 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 и проверьте, возвращается ли какой-либо объект /

Доверенные корневые центры сертификации обновляются автоматически, если в системе есть доступ к Интернету и эта функция не отключена. Вы также можете использовать certutil для загрузки доверенных корневых сертификатов, публикации их в общей папке и создания групповой политики, чтобы указать системам, где их получить.

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/dn265983(v%3Dws.11)

http://woshub.com/updating-trusted-root-certificates-in-windows-10/

Key: HKLM\Software\Policies\Microsoft\SystemCertificates\AuthRoot

Value: DisableRootAutoUpdate