Данный материал является переводом оригинальной статьи «ATA Learning : Michael Soule : Manage Certs with Windows Certificate Manager and PowerShell».
Работа с сертификатами обычно является одной из тех дополнительных задач, которые вынужден брать на себя системный администратор Windows. Диспетчер Сертификатов Windows (Windows Certificate Manager) — это один из основных инструментов, который позволяет выполнять эту работу.
В этой статье мы рассмотрим работу с сертификатами применительно к операционной системе Windows. Если же вы хотите узнать больше о том, как работают сертификаты в целом, ознакомьтесь с сопутствующей статьей «Your Guide to X509 Certificates».
Понимание хранилищ сертификатов
В диспетчере сертификатов Windows все сертификаты находятся в логических хранилищах, называемых «хранилищами сертификатов». Хранилища сертификатов – это «корзины», в которых Windows хранит все сертификаты, которые в настоящее время установлены, и сертификат может находиться более чем в одном хранилище.
К сожалению, хранилища сертификатов — не самая интуитивно понятная концепция для работы. О том, как различать эти хранилища и как с ними работать, вы прочитаете ниже.
Каждое хранилище находится в Реестре Windows и в файловой системе. При работе с сертификатом в хранилище вы взаимодействуете с логическим хранилищем, не изменяя напрямую реестр или файловую систему. Этот более простой способ позволяет вам работать с одним объектом, в то время как Windows заботится о том, как представить этот объект на диске.
Иногда можно встретить хранилища сертификатов, называемые физическими или логическими хранилищами. Физические хранилища ссылаются на фактическую файловую систему или место в реестре, где хранятся разделы реестра и / или файл(ы). Логические хранилища — это динамические ссылки, которые ссылаются на одно или несколько физических хранилищ. С логическими хранилищами намного проще работать, чем с физическими хранилищами для наиболее распространенных случаев использования.
Windows хранит сертификаты в двух разных областях — в контексте пользователя и компьютера. Сертификат помещается в один из этих двух контекстов в зависимости от того, должен ли сертификат использоваться одним пользователем, несколькими пользователями или самим компьютером. В остальной части этой статьи сертификат в контексте пользователя и компьютера будет неофициально называться сертификатами пользователей и сертификатами компьютеров.
Сертификаты пользователей
Если вы хотите, чтобы сертификат использовался одним пользователем, то идеальным вариантом будет хранилище пользовательских сертификатов внутри Диспетчера сертификатов Windows. Это общий вариант использования процессов аутентификации на основе сертификатов, таких как проводной IEEE 802.1x.
Сертификаты пользователей находятся в профиле текущего пользователя и логически отображаются только в контексте этого пользователя. Сертификаты пользователей «сопоставлены» и уникальны для каждого пользователя даже в одних и тех же системах.
Компьютерные сертификаты
Если сертификат будет использоваться всеми пользователями компьютера или каким-либо системным процессом, его следует поместить в хранилище в контексте компьютера. Например, если сертификат будет использоваться на веб-сервере для шифрования связи для всех клиентов, размещение сертификата в контексте компьютера будет подходящим вариантом.
Вы увидите, что хранилище сертификатов компьютера логически сопоставлено для всех пользовательских контекстов. Это позволяет всем пользователям использовать сертификаты в хранилище сертификатов компьютера в зависимости от разрешений, настроенных для закрытого ключа.
Сертификаты компьютера находятся в кусте реестра локального компьютера и в подкаталогах \ProgramData. Сертификаты пользователя находятся в кусте реестра текущего пользователя и в подкаталогах \AppData. Ниже вы можете увидеть, где каждый тип хранилища находится в реестре и файловой системе.
Контекст | Путь реестра | Объяснение |
---|---|---|
User | HKEY_CURRENT_USER SOFTWARE\Microsoft\SystemCertificates\ |
Физическое хранилище для пользовательских открытых ключей |
User | HKEY_CURRENT_USER SOFTWARE\Policies\Microsoft\SystemCertificates\ |
Физическое хранилище для пользовательских открытых ключей, установленных объектами групповой политики Active Directory (AD) (GPO) |
Computer | HKEY_LOCAL_MACHINE SOFTWARE\Microsoft\SystemCertificates\ |
Физическое хранилище общедоступных ключей для всей машины |
Computer | HKEY_LOCAL_MACHINE SOFTWARE\Microsoft\Cryptography\Services\ |
Физическое хранилище ключей, связанных с определенной службой |
Computer | HKEY_LOCAL_MACHINE SOFTWARE\Policies\Microsoft\SystemCertificates\ |
Физическое хранилище открытых ключей для всей машины, установленных объектами групповой политики. |
Computer | HKEY_LOCAL_MACHINE SOFTWARE\Microsoft\EnterpriseCertificates\ |
Физическое хранилище общедоступных ключей, установленных корпоративными контейнерами PKI в домене AD |
Контекст | Расположение файла | Объяснение |
---|---|---|
User | $env:APPDATA\Microsoft\SystemCertificates\ | Физическое хранилище для пользовательских открытых ключей и указателей на закрытые ключи |
User | $env:APPDATA\Microsoft\Crypto\ | Физическое хранилище для контейнеров закрытых ключей для конкретных пользователей |
Computer | $env:ProgramData\Microsoft\Crypto\ | Физическое хранилище для контейнеров закрытых ключей для всей машины |
Предварительные требования
В оставшейся части этой статьи вы найдете несколько примеров, демонстрирующих взаимодействие с хранилищами сертификатов Windows. Чтобы воспроизвести эти примеры, убедитесь, что выполняются следующие требования:
- Windows Vista, Windows Server 2008 или более новая операционная система. В показанных примерах используется Windows 10 Корпоративная версии 1903.
- Знакомство с PowerShell. Хотя это и не обязательно, этот язык будет использоваться для ссылки на сертификаты, где это необходимо. Все показанные примеры были созданы с помощью Windows PowerShell 5.1.
- Вам не потребуется устанавливать какие-либо специальные сертификаты, но использование самозаверяющего сертификата полезно.
Управление сертификатами в Windows
В Windows есть три основных способа управления сертификатами:
- Оснастка консоли управления Microsoft (MMC) сертификатов (certmgr.msc)
- PowerShell
- Инструмент командной строки certutil
В этой статье вы узнаете, как управлять сертификатами с помощью оснастки Certificates MMC и PowerShell. Если вы хотите узнать больше о том, как использовать certutil, ознакомьтесь с документацией Microsoft.
PowerShell против диспетчера сертификатов Windows
Поскольку в Windows можно управлять сертификатами несколькими способами, встаёт вопрос выбора, что лучше использовать — GUI (MMC) или командную строку с PowerShell.
Во-первых, рассмотрим жизненный цикл сертификата. Если вы собираетесь установить или удалить один сертификат только один раз, рассмотрите возможность использования MMC. Но если вы управляете несколькими сертификатами или выполняете одну и ту же задачу снова и снова, использование командной строки может оказаться правильным решением. Даже если вы не умеете писать сценарии PowerShell, вам стоит этому научиться, если у вас есть много разных сертификатов, которыми нужно управлять.
Давайте сначала посмотрим, как обнаружить сертификаты, установленные в Windows, с помощью диспетчера сертификатов и PowerShell.
Использование диспетчера сертификатов Windows (certmgr.msc)
Чтобы просмотреть сертификаты с помощью MMC, откройте Диспетчер сертификатов: откройте меню «Пуск» и введите certmgr.msc. Это вызовет Windows Certificates MMC. Это начальное представление предоставит обзор всех логических хранилищ, отображаемых в левом окне.
На снимке экрана ниже видно, что выбрано логическое хранилище доверенных корневых центров сертификации
Просмотр физических хранилищ
По умолчанию Диспетчер сертификатов Windows не отображает физические хранилища. Чтобы показать их, в верхнем меню оснастки выбирайте «View» > «Options«. Затем вы увидите варианты отображения физических хранилищ сертификатов. Включение этого параметра упрощает определение конкретных путей в Windows.
Теперь вы можете видеть, что дополнительные контейнеры показаны в примере логического хранилища доверенных корневых центров сертификации, показанном ранее. Сертификаты по-прежнему сгруппированы относительно их логических хранилищ, но теперь вы можете увидеть физическое хранилище «Реестр».
Проверка атрибутов в диспетчере сертификатов Windows
Есть много атрибутов сертификата, которые вы можете увидеть при просмотре их с помощью MMC. Например, вы, вероятно, захотите выбрать определенные сертификаты по их атрибутам. Самый простой способ сделать это — указать Serial Number сертификата или значение Thumbprint. Если сертификат был подписан центром сертификации (CA), при выдаче он будет иметь серийный номер. Thumbprint вычисляется каждый раз при просмотре сертификата.
Вы можете увидеть некоторые атрибуты сертификата, открыв его в MMC, как показано ниже.
Следует отметить одну важную особенность — встроенные закрытые ключи. Сертификаты в Windows также могут иметь соответствующий закрытый ключ. Эти закрытые ключи хранятся в соответствующих физических хранилищах в виде зашифрованных файлов.
Чтобы быстро отличать сертификаты с соответствующим закрытым ключом и без него, посмотрите на значок сертификата. В Диспетчере сертификатов Windows, если значок просто выглядит как лист бумаги с лентой, соответствующий закрытый ключ отсутствует. Если у сертификата есть закрытый ключ, вы увидите ключ на значке MMC, и ключ в нижней части вкладки «Общие» при открытии сертификата
Использование PowerShell по физическому хранилищу
Как и в случае с MMC, вы можете просматривать сертификаты и управлять ими с помощью PowerShell. Давайте сначала проверим сертификаты в их физических хранилищах (реестр и файловая система).
Используя PowerShell командлет Get-ChildItem, вы можете перечислить все ключи и значения внутри родительского пути в реестре. Приведенная ниже команда перечислит все сертификаты вошедшего в систему пользователя в логическом хранилище промежуточных центров сертификации.
Get-ChildItem -Path 'HKCU:\Software\Microsoft\SystemCertificates\CA\Certificates'
Каждая запись в кусте реестра, который вы видите, будет соответствовать отпечатку сертификата доверенного центра сертификации и его сертификату в соответствующем свойстве. Вы можете увидеть пример вывода ниже.
Другое распространенное хранилище — это Personal store. Ваши сертификаты для этого хранилища находятся в файловой системе, а не в реестре. В следующих командах мы покажем эти различные физические пути и их цели.
Каждый файл в каталоге, возвращенный приведенной ниже командой, соответствует сертификату, установленному в личном хранилище текущего пользователя.
Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Certificates\
Каждый файл, возвращаемый в приведенной ниже команде, является ссылкой на объект для закрытого ключа, созданный поставщиком хранилища ключей (KSP). Имя файла соответствует идентификатору ключа субъекта сертификата. К каждому устанавливаемому вами закрытому ключу будет добавлен соответствующий файл.
Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Keys\
Каждый файл в каталоге, возвращаемый следующей командой, является уникальным контейнером для зашифрованного закрытого ключа, созданного KSP. Нет прямой связи между именем файла и сертификатом, но файл является целью указателя в предыдущей команде.
Get-ChildItem -Path $env:APPDATA\Microsoft\Crypto\Keys
Использование PowerShell по логическому хранилищу
Поскольку работа с сертификатами на их физических путях встречается редко, в остальных примерах вы будете работать с логическими хранилищами.
PowerShell может получить доступ к логическим хранилищам Windows с помощью PSDrive-объекта «Cert:\«, который сопоставляет сертификаты с физическими хранилищами так же, как это делает MMC.
К сожалению, MMC и «Cert:» не маркируют логические хранилища одинаково. Ниже вы можете увидеть сравнительную таблицу общих хранилищ и их названий как в MMC, так и в «Cert:» PSDrive.
Cert: | Certificates MMC |
---|---|
My | Personal |
Remote Desktop | Remote Desktop |
Root | Trusted Root Certification Authorities |
CA | Intermediate Certification Authorities |
AuthRoot | Third-Party Root Certification Authorities |
TrustedPublisher | Trusted Publishers |
Trust | Enterprise Trust |
UserDS | Active Directory User Object |
Выбор сертификатов
Когда вы работаете с сертификатами, вам понадобится способ фильтрации и выбора сертификатов для выполнения определенных операций. В большинстве случаев вы будете фильтровать и выбирать сертификаты на основе значения определенного расширения.
Для следующих примеров вам нужно начать с перечисления всех установленных сертификатов в хранилище корневого ЦС.
Get-ChildItem -Path 'Cert:\CurrentUser\Root\'
Возвращенные объекты будут объектами сертификатов, которые вы можете использовать в следующих примерах.
Общие расширения уже доступны как свойства объектов сертификата. В приведенном ниже примере вы используете Get-Member для вывода списка всех свойств возвращаемых объектов.
Get-ChildItem -Path 'Cert:\CurrentUser\Root\' | Get-Member -MemberType Properties
Как видим, некоторые из этих расширений, например «Issuer», помогают найти сертификат, который вы ищете. Расширения предоставляют информацию о сертификате, например, кому он выдан, для чего его можно использовать и любые ограничения на него.
В более сложных случаях использования вам может понадобиться найти сертификаты других расширений, таких как используемый шаблон сертификата. Сложность в том, что значения этих расширений возвращаются как массив целых чисел. Эти целые числа соответствуют содержимому в кодировке ASN.1.
Покажем пример взаимодействия с свойствами типа ScriptProperty. В приведенной ниже команде вы извлекаете Key Usages.
((Get-ChildItem -Path 'Cert:\CurrentUser\Root\' | Select -First 1).Extensions | Where-Object {$_.Oid.FriendlyName -eq 'Key Usage'}).format($true)
Новая часть, которую мы вводим в приведенной выше команде, — это метод форматирования, который выполняет декодирование ASN.1. Вы передаете ему логическое значение (например, $true), чтобы определить, хотим ли мы, чтобы возвращаемый объект был однострочным или многострочным.
Попробуем использовать значение Thumbprint из сертификата в приведенной ниже команде. Значение Thumbprint устанавливается как переменная PowerShell и используется для выбора конкретного сертификата в приведенных ниже командах.
$thumb = "cdd4eeae6000ac7f40c3802c171e30148030c072"
Get-ChildItem -Path 'Cert:\CurrentUser\Root\' | Where-Object {$_.Thumbprint -eq $thumb}
Создание самозаверяющих (self-signed) сертификатов с помощью PowerShell
PowerShell может создавать самозаверяющие (self-signed) сертификаты с помощью командлета New-SelfSignedCertificate. Самозаверяющие сертификаты полезны для тестирования, поскольку они позволяют генерировать пару открытого и закрытого ключей без использования центра сертификации.
Теперь давайте создадим самозаверяющий сертификат в хранилищах текущего пользователя и локального компьютера, чтобы использовать его в примерах для следующих шагов.
В приведенном ниже примере PowerShell создает пару открытого и закрытого ключей, самозаверяющий сертификат и устанавливает их все в соответствующие хранилища сертификатов.
New-SelfSignedCertificate -Subject 'User-Test' -CertStoreLocation 'Cert:\CurrentUser\My'
New-SelfSignedCertificate -Subject 'Computer-Test' -CertStoreLocation 'Cert:\LocalMachine\My'
Использование самозаверяющих сертификатов для продуктивных сервисов не рекомендуется, поскольку не существует всех механизмов, основанных на доверии.
Импорт и экспорт сертификатов в MMC
Криптография с открытым ключом основана на широкой доступности открытого ключа. Учитывая это, вам нужны стандартные способы эффективного обмена сертификатами. Не менее важна безопасность ваших личных ключей. Хранение закрытых ключей на недоступных носителях или с материалами для аварийного восстановления — обычная практика для определенных закрытых ключей.
Оба они требуют способов хранения этих криптографических объектов в стандартных форматах. Экспорт предоставляет функции для сохранения этих объектов и обеспечения использования широко распространенных стандартных форматов файлов. Импорт позволяет вам переносить криптографические объекты в операционные системы Windows.
Экспорт сертификатов из MMC относительно прост. Чтобы экспортировать сертификат без закрытого ключа, щелкните сертификат в MMC, выберите меню «Все задачи», а затем «Экспорт».
Во время экспорта вам будет предложено указать формат файла, как показано ниже. Наиболее распространены варианты кодирования — DER или Base-64
Экспорт закрытых ключей
Чтобы экспортировать сертификат с соответствующим закрытым ключом, вы должны соответствовать двум критериям:
- Вошедшая в систему учетная запись должна иметь разрешение на закрытый ключ (только для сертификатов компьютеров);
- Закрытый ключ должен быть помечен как экспортируемый.
Чтобы проверить разрешения для закрытых ключей локального компьютера, вы можете выбрать сертификат с закрытым ключом, выбрать «Все задачи» и «Управление закрытыми ключами» в MMC «Сертификаты». В открывшемся диалоговом окне отображаются записи управления доступом для закрытых ключей.
Когда выше обозначенные условия выполнены, вы можете выбрать сертификат, щелкнуть «Все задачи», а затем «Экспорт», как если бы вы использовали сертификат только с открытым ключом. При экспорте теперь у вас должна присутствовать возможность выбора экспорта закрытого ключа («Yes, export the private key»), как показано ниже.
Когда вы экспортируете закрытый ключ в Windows, вы можете сохранить файл только как PFX. Этот и другие типы файлов и форматы кодирования подробно описаны в этом посте.
Для остальных параметров, отображаемых в мастере экспорта, вы можете использовать значения по умолчанию. В таблице ниже приводится краткое изложение каждого из них.
Настройка | Описание |
---|---|
Including all certificates in the certification path if possible | Помогает с переносимостью эмитентов сертификатов и включает все соответствующие открытые ключи в PFX. |
Delete the private key if the export is successful | Удаляет закрытый ключ из файла и имеет несколько распространенных вариантов использования, но одним из примеров является проверка доступа к закрытым ключам. |
Export all extended properties | Будет включать любые расширения в текущем сертификате, они относятся к сертификатам [конкретные настройки] для интерфейсов Windows. |
Enable certificate privacy | Обычно в экспортируемом PFX-файле шифруется только закрытый ключ, этот параметр шифрует все содержимое PFX-файла. |
Group or user names | Вы можете использовать участника безопасности группы или пользователя из Active Directory для шифрования содержимого файла PFX, но пароль является наиболее переносимым вариантом для устаревших систем или компьютеров, не присоединенных к тому же домену. |
Импорт сертификатов
Функция импорта одинакова для всех поддерживаемых типов файлов сертификатов. Единственная разница в том, что если файл содержит закрытый ключ, вы можете «Отметить этот ключ как экспортируемый», о чем вы узнаете подробнее ниже. Windows будет использовать мастер импорта сертификатов.
При использовании мастера импорта сертификатов для PFX вам потребуется указать пароль, используемый для шифрования закрытого ключа. Вот еще один обзор вариантов импорта.
Настройка | Описание |
---|---|
Enable strong private key protection | Требуется пароль для каждого доступа к закрытому ключу. Будьте осторожны с новыми функциями, поскольку они не будут поддерживаться во всех программах. |
Mark this key as exportable | Вы должны стараться избегать использования этого параметра в любой конечной системе, закрытые ключи следует рассматривать так же, как и хранение паролей. |
Protect private key using [virtualization-based security] | Этот параметр обеспечивает дополнительные функции безопасности для защиты закрытых ключей от сложных атак вредоносного ПО. |
Include all extended properties | Относится к тем же настройкам Windows, что и при экспорте. |
Сертификаты для подписи кода PowerShell — хороший вариант использования надежной защиты закрытого ключа.
С автоматическим размещением сертификатов следует проявлять осторожность. Скорее всего, вы получите наилучшие результаты, выбрав хранилище сертификатов вручную.
Импорт и экспорт сертификатов в PowerShell
Теперь с помощью PowerShell экспортируйте один из самозаверяющих сертификатов, которые вы создали ранее. В этом примере вы выбираете сертификат в личном логическом хранилище CurrentUser, который был самозаверяющим.
$certificate = Get-Item (Get-ChildItem -Path 'Cert:\CurrentUser\My\' | Where-Object {$_.Subject -eq $_.Issuer}).PSPath
Теперь, когда вы выбрали сертификат, вы можете использовать команду Export-Certificate, чтобы сохранить файл в кодировке DER, используя команду ниже.
Export-Certificate -FilePath $env:USERPROFILE\Desktop\certificate.cer -Cert $certificate
Теперь давайте посмотрим на экспорт закрытого ключа. Ниже вы проверяете, что у выбранного сертификата есть закрытый ключ. Если он не возвращает True, то команда Get-Item, скорее всего, выбрала неправильный сертификат.
$certificate.HasPrivateKey
Ниже вы установите пароль, который будет использоваться для шифрования закрытого ключа. Затем экспортируйте выбранный сертификат в файл PFX и используйте пароль, который вы ввели ранее, чтобы зашифровать файл.
$pfxPassword = "ComplexPassword!" | ConvertTo-SecureString -AsPlainText -Force
Export-PfxCertificate -FilePath $env:USERPROFILE\Desktop\certificate.pfx -Password $pfxPassword -Cert $certificate
В случае, если необходимо выполнить импорт, как и при экспорте, есть две команды. Одна команда для импорта сертификатов и одна для импорта файлов PFX.
Ниже команда Import-Certificate импортирует файл в формате DER, который вы экспортировали ранее, в личное хранилище текущего пользователя.
Import-Certificate -FilePath $env:USERPROFILE\Desktop\certificate.cer -CertStoreLocation 'Cert:\CurrentUser\My'
Допустим, вы тоже хотите установить закрытый ключ этого сертификата.
$pfxPassword = "ComplexPassword!" | ConvertTo-SecureString -AsPlainText -Force
Import-PfxCertificate -Exportable -Password $pfxPassword -CertStoreLocation 'Cert:\CurrentUser\My' -FilePath $env:USERPROFILE\Desktop\certificate.pfx
Имейте в виду, что пароль должен быть защищенной строкой. Кроме того, если вы импортируете в хранилище локального компьютера (например, «Cert:\LocalMachine«), вам нужно будет запустить команду из командной строки администратора с повышенными привилегиями.
В приведенном выше примере вы также используете параметр -Exportable с командой, отмечая закрытый ключ как экспортируемый в будущем. По умолчанию (без указания этого параметра) экспорт не используется. Экспортируемые закрытые ключи – отельный аспект информационной безопасности, заслуживающий отдельного внимания.
Удаление сертификатов с помощью PowerShell
При удалении сертификатов помните, что понятие «Корзина Windows» в этом случае отсутствует. Как только вы удалите сертификат, он исчезнет! Это означает, что очень важно подтвердить, что вы удаляете правильный сертификат, путем проверки уникального идентификатора, такого как серийный номер или значение расширения Thumbprint.
Как и выше, в приведенной ниже команде мы выбираем самозаверяющий сертификат из личного хранилища текущего пользователя.
$certificate = Get-Item (Get-ChildItem -Path 'Cert:\CurrentUser\My\' | Where-Object {$_.Subject -eq $_.Issuer}).PSPath
Ниже вы можете увидеть свойства отпечатка, серийного номера и темы для выбранного сертификата, чтобы убедиться, что это именно тот сертификат, который вы собираетесь выбрать.
$certificate.Thumbprint
$certificate.SerialNumber
$certificate.Subject
Убедитесь, что вы выбрали правильный сертификат, который собираетесь удалить.
Приведенная ниже команда удаляет все выбранные объекты сертификата, используйте с осторожностью! Передав объект $certificate через конвейер в командлет Remove-Item в приведенной ниже команде, вы удалите все содержимое сертификата без каких-либо запросов на проверку.
$certificate | Remove-Item
Резюме
На протяжении всей этой статьи вы работали с сертификатами в Windows, изучая, как получить к ним доступ, и некоторые инструменты, которые можно использовать при работе с ними. По этой теме можно изучить гораздо больше, в том числе о том, как связать установленные сертификаты с конкретными службами или даже о том, как реализовать инфраструктуру закрытого открытого ключа (PKI) путем развертывания собственных центров сертификации (CA).
-
Understanding the Certificate Store
-
Prerequisites for Using PowerShell
-
Deleting a Certificate Using PowerShell
-
Conclusion
-
FAQ
Managing certificates on your computer can sometimes feel like a daunting task, especially if you’re not familiar with the tools available. One of the most efficient ways to handle certificates is through PowerShell.
In this tutorial, we will guide you through the process of removing a certificate from the certificate store using PowerShell commands. Whether you’re cleaning up old certificates or managing security settings, this guide will provide you with the necessary steps to ensure your certificate store is tidy and secure. Let’s dive in and explore how to manage certificates effectively with PowerShell.
Understanding the Certificate Store
Before we jump into the process of deleting certificates, it’s essential to understand what the certificate store is. The certificate store is a centralized location on your computer where digital certificates are stored. These certificates are crucial for various security protocols, such as SSL/TLS, code signing, and email encryption. PowerShell provides a straightforward way to interact with this store, allowing you to view, add, or remove certificates as needed.
Prerequisites for Using PowerShell
To effectively use PowerShell for managing certificates, you should have administrative privileges on your computer. This ensures that you can make the necessary changes to the certificate store. Additionally, it is advisable to familiarize yourself with basic PowerShell commands and syntax. With these prerequisites in mind, you are ready to start managing your certificates.
Deleting a Certificate Using PowerShell
Now that you have a basic understanding of the certificate store and the prerequisites, let’s move on to the steps for deleting a certificate using PowerShell. This method is efficient and straightforward, allowing you to remove unwanted certificates quickly.
Step 1: Open PowerShell
First, you need to open PowerShell as an administrator. To do this, search for “PowerShell” in the Start menu, right-click on it, and select “Run as administrator.” This step is crucial as it grants you the necessary permissions to modify the certificate store.
Step 2: List Certificates in the Store
Before deleting a certificate, it is wise to list the certificates currently stored. You can do this using the following command:
Get-ChildItem -Path Cert:\LocalMachine\My
Output:
Thumbprint Subject
---------- -------
A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9 CN=example.com
This command retrieves all certificates in the “My” store of the local machine. You will see the thumbprint and subject of each certificate, which will help you identify the one you want to delete.
Step 3: Delete the Certificate
Once you have identified the certificate you wish to remove, you can delete it with the following command, replacing <Thumbprint>
with the actual thumbprint of the certificate:
Remove-Item -Path Cert:\LocalMachine\My\<Thumbprint>
Output:
Certificate with thumbprint <Thumbprint> has been deleted.
Executing this command will remove the specified certificate from the store. Ensure you double-check the thumbprint before running this command, as deleting a certificate is irreversible.
Deleting a certificate using PowerShell is a straightforward process that can be completed in just a few steps. It’s an effective way to manage your digital certificates and maintain a secure environment on your computer.
Conclusion
In this tutorial, we explored how to delete a certificate from the certificate store using PowerShell. By following the steps outlined above, you can efficiently manage your certificates and ensure your system remains secure. Remember, handling certificates requires caution, so always double-check before deleting any certificate. With this knowledge, you can now keep your certificate store organized and free from unnecessary clutter.
FAQ
-
What is a certificate store?
A certificate store is a centralized location on a computer where digital certificates are stored for various security purposes. -
Why would I want to delete a certificate?
You may want to delete a certificate if it is outdated, no longer needed, or if you are cleaning up your certificate store for security reasons. -
Can I recover a deleted certificate?
No, once a certificate is deleted from the store, it cannot be recovered. Always ensure you have backups if necessary. -
Do I need administrative privileges to delete a certificate?
Yes, you must run PowerShell as an administrator to delete certificates from the certificate store. -
Is it safe to delete certificates?
It is safe to delete certificates that you are sure are no longer needed. However, exercise caution to avoid removing essential certificates.
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
Если вы используете на хосте Windows бесплатные сертификатов Let’s Encrypt и решили переключиться на другой CA (собственный или коммерческий), нужно выполнить ряд шагов по отзыву старых сертификатов Let’s Encrypt и очистки их следов в Windows.
Ранее мы показывали, как с помощью клиента WACS в Windows настроить автоматический выпуск и продление сертификатов Let’s Encrypt для защиты подключений к веб-сайтам или службам RDS. Если вы использовали консольный клиент WACS для выпуска и установки сертификата Let’s Encrypt, для его корректного удаления нужно выполнять ряд действий:
- Удалить задание планировщика для автоматического продления сертификата
- Отозвать старый сертификат Let’S Encrypt (или оставить его как есть, чтобы срок действия его истек автоматически)
- Отключить использование сертификата Let’S в настройках веб сайта IIS или службах RDS
- Удалить клиент WACS и связанные файлы
- Очистить каталог C:\ProgramData\win-acme\
При установке сертификата Let’s Encrypt, утилита wacs автоматически создает задание планировщика, которое по расписанию проверяет срок действия сертификата и продляет его.
- Откройте планировщик задач Windows Task Sheduler (
taskschd.msc
) и найдите в нем задание продления сертификата. По умолчанию оно называется win-acme renew (acme-v02.api.letsencrypt.org). - В свойствах задания на вкладке Actions можно найти путь к каталогу с исполняемым файлом клиента wacs.exe (в нашем примере это C:\ps\wacs).
- Отключите (или удалите) задание планировщика.
Если в Windows установлено и используется несколько сертификатов Let’S encrypt с автопродлением, можно отключить продление только для определенного сертификата. Вывести все задания продления сертификатов:
.\wacs.exe --list
Отключить обновление определенного сертификата можно по
--friendlyname
или
--id
:
.\wacs.exe --cancel --friendlyname "[Manual] 123356.winitpro.ru"
Параметры автоматического продления сертификатов хранятся в файлах с расширением *.renewal.json в каталоге C:\ProgramData\win-acme\acme-v02.api.letsencrypt.org. Можно просто удалить JSON файл с настройками.
Чтобы отозвать выпущенный сертификат Let’s Encrypt выполните команду:
.\wacs.exe --revoke --friendlyname "[Manual] 123356.winitpro.ru"
Также можно отключить задания продления и отозвать сертификат из меню утилиты wacs. Пункт находятся в разделе A: Manage renewals:
Теперь нужно отвязать сертификат в настройках сайта IIS.
- Откройте консоль управления IIS (
inetmgr
). - Перейдите в настройки Site Bindings сайта IIS и выберите для сайта другой сертификат вместо Let’s Encrypt.
- Перейдите в раздел Server Certificates в настройках IIS и удалите сертификат Let’s Encrypt. Это также удаляет сертификат из локального хранилища сертификатов.
Либо вы можете удалить сертификат из локального хранилища вручную. Чтобы вывести все сертификаты Let’s Encrypt, установленные в хранилище, выполните PowerShell команду:
dir cert: -Recurse|Where-Object { $_.Issuer -like "*Let's Encrypt*" }|select FriendlyName,Subject,NotBefore,NotAfter,PSParentPath,thumbprint
Команда выведет имя, отпечаток, дату выпуска и срок действия установленных сертификатов Let’s Encrypt.
В данном примере есть два сертификата, установленные в хранилище
LocalMachine\WebHosting
.
Откройте консоль хранилища сертификатов компьютера (
certlm.msc
), разверните раздел Web Hosting -> Certificates и удалите сертификаты Let’s Encrypt.
Затем удалите следующие папки
- Каталог с клиентом WAСS (в нашем примере
C:\PS\wacs
, как мы выяснили в настройках задания планировщика) - Папку с данными
C:\ProgramData\win-acme\
(здесь хранятся файлы сертификатов, закрытые ключи, конфигурационные файлы, логи).
Перезапустите веб сервер IIS:
iisreset
Blog October 2, 2019
Certificates, Cryptographic Keys, PowerShell
Yesterday I went through one thread on Reddit: New to PS and want to create a script to clear all personal certificates from a local machine and something was suspicious to me. Then I went further and asked google for similar question and examined first page:
- Delete certificate from Computer Store
- Removing a certificate from the local machine certificate store in powershell?
- Powershell – Deleting certificate from Store
- Powershell Script to remove expired certificates
- Powershell Script to Remove all Expired Certificates on a Group of Servers
- How to remove certificate using powershell
- Remove Certificates via PowerShell
- #PSTip Deleting expired certificates from the personal certificate store
- There is no 2nd page on Google
These searches were for PowerShell. Um? Let’s look at C# results:
- How to remove certificate from Store cleanly
- Programmatically Delete X.509 SSL Cetificates
- Lots of them!
And they walk around same code fragment. If you look closely to all answers, they provide same solution: raw Remove-Item cmdlet in PowerShell and X509Store.Remove(X509Certificate2) in .NET applications.
Fair enough, all these solutions are correct, they do their work, what is wrong with them? Answer: they are not complete. Years ago I wrote a blog post about the case of accidentally deleted user certificates. Neither of provided solution removes private key associated with certificate. Key pair is still on a boat and is perfectly usable. And if we get a copy of public certificate, we can reconstruct the association between public and private parts of certificate and even export them to PFX. You should follow private key hygiene and take additional actions to remove the private key material from key storage whenever you remove certificate (with associated private key).
PowerShell solution
If you are using PowerShell, then take a look at dynamic parameter called –DeleteKey
for Remove-Item cmdlet: Deleting Certificates and Private Keys:
Remove-Item ` -Path cert:\LocalMachine\My\D2D38EBA60CAA1C12055A2E1C83B15AD450110C2 ` -DeleteKey
It is a very tiny switch, easy to miss, but extremely valuable when talking about key material removal from store. Essentially, this is a complete solution. There is one pitfall: don’t do this in remote sessions!
If key is stored on hardware device (smart card, HSM), a PIN prompt popup may appear and there is no one to enter the PIN or close the dialog in remote session. Do it only locally.
.NET solution
If you are removing certificates from .NET code, you will have to do a bit more of work and use p/invoke or use 3rd party solutions. For example, a PSPKI supporting library implements an extension method: X509Certificate2Extensions.DeletePrivateKey Method. Reference the SysadminsLV.PKI.dll in your project and add SysadminsLV.PKI.Utils.CLRExtensions namespace in usings.
If you don’t like 3rd party solutions, you have to go hard way: p/invoke. Many programmers refuse p/invoke because of various reasons, but it is not that bad since about a half of .NET Framework uses p/invoke. Even .NET Core.
If you are using .NET Core, this solution will work only on Windows platform
If your key is stored in legacy CSP, call CryptAcquireContext function and pass CRYPT_DELETEKEYSET flag in dwFlags
parameter.
If your key is stored in CNG Key Sotrage Provider, call NCryptDeleteKey function.
Bear in mind, that when calling CryptAcquireContext, you must specify NCRYPT_MACHINE_KEY_FLAG flag if private key is stored in local machine store (opposite to current user store). Best way is to create an extension method that will handle all this. Here is sample code:
using System; using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using Microsoft.Win32.SafeHandles; namespace CertTools { public static class CertExtensions { // some CryptoAPI constants const UInt32 NCRYPT_MACHINE_KEY_FLAG = 0x00000020; const UInt32 CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG = 0x00010000; const UInt32 CRYPT_DELETEKEYSET = 0x00000010; // some CryptoAPI function [DllImport("ncrypt.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern Int32 NCryptDeleteKey( [In] SafeNCryptKeyHandle hKey, [In] UInt32 dwFlags ); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern Boolean CryptAcquireContext( ref IntPtr phProv, String pszContainer, String pszProvider, UInt32 dwProvType, Int64 dwFlags ); [DllImport("Crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern Boolean CryptAcquireCertificatePrivateKey( [In] IntPtr pCert, [In] UInt32 dwFlags, [In, Optional] IntPtr pvReserved, [Out] out SafeNCryptKeyHandle phCryptProv, [Out] out UInt32 pdwKeySpec, [Out] out Boolean pfCallerFreeProv ); public static Boolean DeletePrivateKey(this X509Certificate2 cert) { // acquire private key handle either, from CSP or KSP if (!CryptAcquireCertificatePrivateKey( cert.Handle, CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG, IntPtr.Zero, out SafeNCryptKeyHandle phCryptProvOrNCryptKey, out UInt32 pdwKeySpec, out Boolean _)) { return false; } // if pdwKeySpec return 0xffffffff, the key is stored in KSP, otherwise, it is legacy CSP. Call appropriate method // depending on key storage return pdwKeySpec == UInt32.MaxValue ? deleteCngKey(phCryptProvOrNCryptKey) : deleteLegacyKey(cert.PrivateKey); } // this method removes key from legacy CSP static Boolean deleteLegacyKey(AsymmetricAlgorithm privateKey) { if (privateKey == null) { return false; } String keyContainer; String provName; UInt32 provType; // depending on key algorithm (RSA/DSA) acquire key container information to use for CryptAcquireContext call switch (privateKey) { case RSACryptoServiceProvider _: keyContainer = ((RSACryptoServiceProvider)privateKey).CspKeyContainerInfo.KeyContainerName; provName = ((RSACryptoServiceProvider)privateKey).CspKeyContainerInfo.ProviderName; provType = (UInt32)((RSACryptoServiceProvider)privateKey).CspKeyContainerInfo.ProviderType; break; case DSACryptoServiceProvider _: keyContainer = ((DSACryptoServiceProvider)privateKey).CspKeyContainerInfo.KeyContainerName; provName = ((DSACryptoServiceProvider)privateKey).CspKeyContainerInfo.ProviderName; provType = (UInt32)((DSACryptoServiceProvider)privateKey).CspKeyContainerInfo.ProviderType; break; default: privateKey.Dispose(); return false; } // we can't tell if key is stored in machine context or current user context. IntPtr phProv = IntPtr.Zero; Boolean status1, status2 = false; // try to delete from local machine status1 = CryptAcquireContext( ref phProv, keyContainer, provName, provType, CRYPT_DELETEKEYSET | NCRYPT_MACHINE_KEY_FLAG); // if method call against local machine fails, attempt to call against current user store. if (!status1) { status2 = CryptAcquireContext( ref phProv, keyContainer, provName, provType, CRYPT_DELETEKEYSET); } privateKey.Dispose(); // if any method succeeded, then key was found and successfully deleted. If both failed, then it may indicate that // private key was not found and there is nothing to delete. Either way, true or false are legitimate results. Don't // throw exceptions. return status1 || status2; } static Boolean deleteCngKey(SafeNCryptKeyHandle phKey) { // with CNG keys everything is simple, just call NCryptDeleteKey Int32 hresult = NCryptDeleteKey(phKey, 0); phKey.Dispose(); return hresult == 0; } } }
I added comments that explain the logic of the code. Refer to Microsoft Docs for unmanaged function description. The code is exception free.