Для управления сертификатами в Windows обычно используются графические MMC оснастки
certlm.msc
(сертификаты компьютера/ Local Machine),
certmgr.msc
(сертификаты пользователя / Current User), утилита командной строки
certutil
. Все эти инструменты используются для взаимодействия с логическим хранилищем сертификатов, которое скрывает от пользователя фактическое расположение открытых и закрытых ключей сертификатов на диске и в реестре.
Логические и физические хранилища сертификатов в Windows
Открытие и закрытые ключи сертификатов в Window не хранятся в одном месте. Открытые ключи сертификатов хранятся в реестре (могут быть извлечены), но их закрытые ключи (если имеются) хранятся на файловой системе и зашифрованы.
Сертификаты в реестре:
| Пользователь |
HKCU\SOFTWARE\Microsoft\SystemCertificates
| Открытые ключи сертификатов пользователя |
| Пользователь |
HKCU\SOFTWARE\Policies\Microsoft\SystemCertificates
|
Открытые ключи сертификатов пользователя, установленные групповыми политиками AD |
| Компьютер |
HKLM\SOFTWARE\Microsoft\SystemCertificates
| Открытые ключи сертификатов компьютера |
| Компьютер |
HKLM\SOFTWARE\Microsoft\Cryptography\Services
| Ключи различных службы |
| Компьютер |
HKLM\SOFTWARE\Policies\Microsoft\SystemCertificates
| Открытые ключи сертификатов компьютера, установленные через GPO |
| Компьютер |
HKLM\SOFTWARE\Microsoft\EnterpriseCertificates
| Ключи компьютера, установленные с корпоративного CA в домене AD |
Закрытые ключи сертификатов на диске:
| Пользователь |
%APPDATA%\Microsoft\SystemCertificates
| Каталог, в котором хранятся пользовательские открытые ключи и указатели на закрытые ключи сертификатов |
| Пользователь |
%APPDATA%\Microsoft\Crypto
| Контейнеры закрытых ключей пользователя |
| Компьютер |
%ProgramData%\Microsoft\Crypto
| Контейнеры закрытых ключей компьютера |
К логическому хранилищу сертификатом можно обратиться из PowerShell с помощью встроенного Cert провайдера, по аналогии как вы обращаетесь к объектам на файловой системе.
Например, с помощью PowerShell перейдем в хранилище сертификатов компьютера:
cd Cert:\LocalMachine\my
Вывести список сертификатов в хранилище:
Get-Item *

Или можно вывести локальные сертификаты компьютера с помощью certutil:
certutil -store MY
Извлекаем сертификаты из реестра Windows
Эти же отпечатки сертификатов отображаются в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\MY. Данные каждого сертификата хранятся в бинарном параметре BLOB, содержащем полный сертификат в формате DER.

Можно извлечь BLOB данные сертификата из реестра (по его отпечатку), перекодировать их в формат X509Certificate2 и получить информацию о сертификате:
$regPath = "HKLM:\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates\7780BAFFDD4469DAB7AF8F4283726721E4A9F4E8"
$blob = (Get-ItemProperty -Path $regPath).Blob
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList (, $blob)
$cert | Format-List Subject, Issuer, NotBefore, NotAfter, Thumbprint

Чтобы конвертировать данный открытый ключ сертификата в файл формата CER (для переноса на другой компьютер), выполните:
$certBytes = $cert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Cert)
[System.IO.File]::WriteAllBytes("c:\temp\exported_certificate.cer", $certBytes)

Такой подход удобно использовать, когда нужно исследовать хранилище сертификатов вышедшего из строя компьютера, получив данные к его офлайн реестру. Это позволит выгрузить все публичные части установленных на компьютере сертификатов.
По умолчанию диспетчер сертификатов Windows
certmgr.msc
отображает логическое представление хранилищ сертификатов. Чтобы показать физические хранилища сертификатов в консоли, нужно в меню выбрать View -> Options и включить опцию Physical certificate stores. Теперь в консоли отображается ключи сертификатов дополнительно сгруппированы по их месту хранения (реестр, локальный компьютер, смарт-карта и т.д.).

Перенос контейнеров закрытых ключей сертификатов Криптопро
Часто возникает вопросы с местом хранения ключей отечественного криптопровайдера Crypto Pro на компьютере. Закрытые ключи пользователя хранятся в ветке реестра вида
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Crypto Pro\Settings\Users\S-1-5-21-xxxxxxxxx
, где S-1-5-21-xxxxxxxxx – SID пользователя владельца ключа.
Можно преобразовать SID пользователя в имя с помощью PowerShell.

Экспортировав эту ветку с компьютера и импортировав ее в аналогичную ветку на другой компьютер (но уже с SID-ом пользователя другого компьютера), можно перенести цифровую подпись в КриптоПро на другой компьютер. Также скопируйте сертификаты из каталога %APPDATA%\Microsoft\SystemCertificates\My на исходном компьютере в каталог
%APPDATA%\Microsoft\SystemCertificates\My
(уже целевого пользователя) на другом компьютере.

