June 11, 2022

Cертификаты, Windows и немного PowerShell

Введение

Сертификат – это контейнер для открытого ключа. Он включает в себя такую информацию как значение открытого ключа, имя сервера или пользователя, некоторую дополнительную информацию о сервере или пользователе, а также содержит электронную подпись, сформированную издающим центром сертификации (ЦС). Ранее мы уже писали о работе с сертификатами pfx с помощью openssl, теперь рассмотрим использование встроенных средств, а именно powershell.

Что такое сертификат PFX

Файл .pfx, который не следует путать с .cer, представляет собой архив PKCS#12; это пакет, который может содержать несколько объектов с дополнительной защитой паролем. Обычно он содержит сертификат (возможно, со своим набором цепочки сертификатов верхнеуровневых УЦ) и соответствующий закрытый ключ. В то время как PFX может содержать в себе несколько сертификатов, файл .cer содержит один единственный сертификат без пароля и закрытого ключа. В Windows все сертификаты находятся в логических местах хранения, называемых хранилищами сертификатов.

Одним из самых распространенных областей применения сертификатов PFX является подпись кода (code signing). Также, в случае защиты надежным паролем pfx можно передавать по открытым каналам связи.

Логические хранилища

Логические хранилища – это виртуальные месторасположения, в которых которых локально храняться сертификаты как для пользователя так и для компьютера. Powershell использует Cert PSDrive для сопоставления сертификатов с физическими хранилищами. Наименование логических хранилищ Certificates Microsoft Management Console (MMC) отличается от маркировки хранилища Cert PSDrive. В таблице ниже показано сравнение между ними:

CERT: CERTIFICATES MMC My Личные Remote Desktop Удаленный рабочий стол Root Доверенные корневые центры сертификации CA Промежуточные центры сертификации AuthRoot Сторонние корневые центры сертификации TrustedPublisher Доверенные издатели Trust Доверительные отношения в предприятии UserDS Объект пользователя Active Directory

Модуль PKI

Утилита MakeCert.exe, входящая в состав Microsoft .NET Framework SDK и Microsoft Windows SDK, используется для создания самоподписанного сертификата. В системе, где не установлен Windows SDK, для управления сертификатами используются команды модуля Powershell PKI.

Чтобы перечислить все команды, доступные в модуле PKI, выполните следующую команду:

Get-Command -Module PKI 

Командлеты, используемые в этой статье, описаны ниже:

Export-PfxCertificate

Командлет Export-PfxCertificate экспортирует сертификат или объект PFXData в файл Personal Information Exchange (PFX). По умолчанию экспортируются расширенные свойства и вся цепочка.

Get-Certificate

КомандлетGet-Certificate можно использовать для отправки запроса на сертификат и установки полученного сертификата, установки сертификата из запроса на сертификат, а также для регистрации в службе каталогов протокола LDAP.

Get-PfxData

Командлет Get-PfxData извлекает содержимое файла Personal Information Exchange (PFX) в структуру, содержащую сертификат конечного субъекта, любые промежуточные и корневые сертификаты.

Import-PfxCertificate

КомандлетImport-PfxCertificate импортирует сертификаты и закрытые ключи из файла PFX в локальное хранилище.

New-SelfSignedCertificate

Командлет New-SelfSignedCertificate создает самоподписанный сертификат. С помощью параметра CloneCert указанный сертификат может быть создан на основе существующего сертификата с копированием всех параметров из оригинального сертификата, за исключением открытого ключа.

Поиск и выбор сертификата

В Powershell Cert: PSDrive используется для вывода списка сертификатов в определенном хранилище. Чтобы вывести оба хранилища в Cert: PSDrive, выполните следующую команду:

Get-ChildItem -Path Cert:

Будут показаны месторасположения сертификатов для CurrentUser и LocalMachine. Чтобы перечислить сертификаты для доверенных корневых центров сертификации LocalMachine, выполните следующую команду:

Get-ChildItem -Path Cert:\LocalMachine\Root\

Возвращаемый объект будет представлять собой сертификаты, которые можно изменить, удалить или экспортировать.

Команду Get-ChildItem можно комбинировать с Where-Object для поиска конкретных сертификатов. Приведенная ниже команда найдет сертификат, предположительно выданный Microsoft, проверяя свойство Subject сертификатов:

Get-ChildItem -Path Cert:\LocalMachine\Root\ | Where-Object {$_.Subject.Contains("Microsoft")}

У выведенных в сертификатов часть значения Subject будет содержать Microsoft.

Создание сертификата

Для создания сертификата необходимо указать значения -DnsName (имя DNS-сервера) или -Subject и -CertStoreLocation (хранилище сертификатов, в которое будет помещен созданный сертификат). Чтобы создать сертификат для DNS itsecforu-test.com и установить его в список Личные сертификаты в системе, выполните следующую команду:

New-SelfSignedCertificate -DnsNameitsecforu-test.com -CertStoreLocation cert:\CurrentUser\My

Команда генерирует новый сертификат и устанавливает его в личное хранилище пользователя. При открытии certmgr.msc ( certlm.msc – для локального компьютера соответственно ) сертификат появится в разделе Personal. В выводе будут показаны сведения о только что созданном сертификате, включая его отпечаток:

По умолчанию самоподписанный сертификат генерируется со следующими настройками:

  • Криптографический алгоритм: RSA;
  • Длина ключа: 2048 бит;
  • Допустимое использование ключа: Проверка подлинност клиента и Проверка подлинности сервера;
  • Сертификат может быть использован для цифровой подписи, шифрования ключей;
  • Срок действия: 1 год.

Срок действия сгенерированного сертификата ограничен одним годом. Для увеличения срока действия сертификата необходимо указать соответствующий атрибут Date с увеличенным значением срока действия с помощью ключа -notafter. Чтобы выпустить сертификат на 5 лет, выполните приведенную ниже команду:

$expiry_year = (Get-Date).AddYears(5) 
New-SelfSignedCertificate -DnsName itsecforu-test.com -notafter $expiry_year -CertStoreLocation Cert:\CurrentUser\My

Новые сертификаты могут быть созданы только в личных хранилищах Cert:\LocalMachine\My или Cert:\CurrentUser\My. Выполните приведенную ниже команду help для просмотра всех остальных параметров, принимаемых командой New-SelfSignedCertificate:

help New-SelfSignedCertificate -Full

Установка сертификата pfx

Сертификат может быть установлен в различные места хранения, каждое место хранения имеет свое определенное назначение, но в этой статье мы будем устанавливать в четыре места Cert:\CurrentUser\My, Cert:\LocalMachine\My, Cert:\CurrentUser\Root и Cert:\LocalMachine\Root. Расположение My является личным хранилищем для ненадежных приложений, а Root – хранилищем для доверенных сертификатов.

Команда, используемая для установки общего сертификата, отличается от команды для установки сертификата PFX. Для установки сертификата pfx используется команда Powershell Import-PfxCertificate.

Чтобы установить сертификат PFX в личное хранилище текущего пользователя, используйте следующую команду:

Import-PfxCertificate -FilePath ./itsecforu.pfx -CertStoreLocation Cert:\CurrentUser\My -Password P@sw0rd 

Для установки в личное местоположение системы измените местоположение хранилища в команде выше с Cert:\CurrentUser\My на Cert:\LocalMachine\My.

Чтобы установить PFX сертификат в доверенное хранилище текущего пользователя, используйте следующую команду:

Import-PfxCertificate -FilePath ./itsecforu.pfx -CertStoreLocation Cert:\CurrentUser\Root -Password P@sw0rd  

При установке в корневое расположение текущего пользователя появится диалоговое окно для подтверждения установки сертификата, но при установке в системное корневое расположение никакого диалога не появится. Для установки в системное доверенное место измените расположение хранилища в команде выше с Cert:\CurrentUser\Root на Cert:\LocalMachine\Root.

Добавление сертификата в список доверенных

Недоверенный сертификат гораздо опаснее и подозрительнее, чем отсутствие сертификата вообще, поэтому важно добавить наш сертификат в доверенные корневые сертификаты.

Сертификаты могут быть созданы только в хранилище Cert:\LocalMachine\My или Cert:\CurrentUser\My . Поскольку любой сертификат в этом месте по умолчанию помечен как недоверенный, чтобы сделать его легитимным, необходимо его переместить из Cert:\LocalMachine\My или Cert:\CurrentUser\My в Cert:\LocalMachine\Root и Cert:\CurrentUser\Root соответственно.

Move-Item -Path$cert-Destination "Cert:\LocalMachine\Root"

Проверка наличия дубликата сертификата

Чтобы избежать повторного добавления уже существующего сертификата в хранилище сертификатов, перед добавлением нового сертификата с тем же значением Subject следует проверить и удалить уже имеющийся сертификат. Powershell автоматически создает путь виртуального диска для метки cert: и ведет себя как обычный каталог. В приведенном ниже фрагменте проверяется путь cert:\LocalMachine\My хранилища сертификатов, чтобы найти сертификат по значению Subject.

$cert_name = "itsecforu-test.com" 
ForEach ($cert in (ls cert:\CurrentUser\My)) { 
If ($cert.Subject -eq "CN=$cert_name") { 
 //the certificate can be deleted or edited in here  
} 
 }

Экспорт и импорт сертификата

Команды для импорта и экспорта pfx-сертификата отличаются от команд для экспорта и импорта обычного сертификата. Команда Import-PfxCertificate используется для импорта запароленного сертификата pfx, а команда Export-PfxCertificate – для экспорта сертификата из места хранения в новое местоположение файла.

Экспорт сертификата pfx

Для экспорта сертификата pfx необходим пароль для шифрования закрытого ключа. В приведенном ниже примере мы используем значение Subject для поиска экспортируемого сертификата, выбрав сертификат, значение Subject которого равно itsecforu-test.com

$certificate = Get-ChildItem -Path Cert:\CurrentUser\My\ | Where-Object {$_.Subject -match "itsecforu-test.com"} 
 
После выбора сертификата его можно экспортировать из места хранения в папку с помощью приведенной ниже команды: 
 
$pass= "Qwerty123" | ConvertTo-SecureString -AsPlainText -Force 
Export-PfxCertificate -Cert $certificate -FilePath $env:USERPROFILE\Documents\itsecforu-test.com.pfx  -Password $pass

Импорт сертификата pfx

Скаченные или экспортированные сертификаты pfx можно установить с помощью команды Import-PfxCertificate. Для импорта требуется пароль для сертификата и местоположение.

Команда ниже импортирует сертификат pfx, который мы экспортировали ранее:

$password= "Qwerty123" | ConvertTo-SecureString -AsPlainText -Force 
Import-PfxCertificate -Exportable -Password $password -CertStoreLocation Cert:\CurrentUser\My -FilePath $env:USERPROFILE\Documents\itsecforu-test.com.pfx

Параметр -Exportable отмечает закрытый ключ как экспортируемый.

Как экспортировать сертификат cer из pfx

Для экспорта сертификата из файла pfx используется комбинированная команда Get-PfxCertificate и Export-Certificate. Get-PfxCertificate используется для поиска сертификата pfx, а Export-Certificate – для экспорта указанного сертификата в FilePath. Требуется ввод пароля от pfx контейнера Ниже приведенная команда экспортирует сертификат в кодировке DER (двоичный) из файла pfx.

Get-PfxCertificate -FilePath "C:\certs\Test.pfx" | 
 
Export-Certificate -FilePath "C:\certs\Test.cer" -Type CERT  
 

Обратите внимание на параметр-Type, который используется для указания типа экспортируемого сертификата, в данном примере это сертификат CERT в кодировке DER (двоичный). Существуют и другие типы, они перечислены ниже.

-Type <CertType> 
Указывает тип выходного файла для экспорта сертификатов следующим образом.  
-- SST: формат файла Microsoft serialized certificate store (.sst), который может содержать один или несколько сертификатов. Это значение по умолчанию для нескольких сертификатов.  
-- CERT: формат файла .cer, который содержит один сертификат в DER-кодировке. Это значение по умолчанию для одного сертификата.  
-- P7B: формат файла PKCS#7, который может содержать один или несколько сертификатов.

Удаление сертификата

Для удаления сертификата можно использовать команду Remove-Item в Powershell. Перед удалением сертификата необходимо узнать его значение thumbprint (отпечатка) или определить сам объект сертификата.

Удаление с помощью thumbprint

В приведенном ниже фрагменте для удаления используется отпечаток сертификата…

Get-ChildItem Cert:\CurrentUser\My\7da4d700318ee2a08f96aab9bc71990ca6376053| Remove-Item

Поиск и удаление сертификата с помощью сопоставления значений

Сертификат можно искать в хранилище с помощью команды Where-Object, которая принимает условный оператор, соответствующий искомому сертификату.

Get-ChildItem Cert:\CurrentUser\My | 
Where-Object { $_.Subject -match 'itsecforu-test.com' } | 
Remove-Item

Обратите внимание, что мы используем значения поля сертификата Subject , другие возможные параметры – Thumbprint и SerialNumber.

Диспетчер сертификатов Windows

Диспетчер сертификатов Windows (certmgr.msc) – это приложение с графическим интерфейсом Windows для управления сертификатами. Найдите certmgr в меню Пуск, чтобы открыть Windows Certificates MMC или введите certmgr.msc в командной строке. Вид консоли предоставляет собой обзор всех локальных хранилищ.

Сертификаты можно устанавливать, удалять, импортировать и экспортировать из диспетчера сертификатов Windows.

Source itsecforu.ru

Сделано ботом @chotamreaderbot