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 экспортирует сертификат или объект PFXData в файл Personal Information Exchange (PFX). По умолчанию экспортируются расширенные свойства и вся цепочка.
КомандлетGet-Certificate можно использовать для отправки запроса на сертификат и установки полученного сертификата, установки сертификата из запроса на сертификат, а также для регистрации в службе каталогов протокола LDAP.
Командлет Get-PfxData извлекает содержимое файла Personal Information Exchange (PFX) в структуру, содержащую сертификат конечного субъекта, любые промежуточные и корневые сертификаты.
КомандлетImport-PfxCertificate импортирует сертификаты и закрытые ключи из файла PFX в локальное хранилище.
Командлет 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