Для поиска сертификатов можно использовать командлет Powershell 'Get-ChildItem'. Один из путей, который мы можем указать в ключе Path - 'Cert:\', который и относится к сертификатам. Мы используем рекурсию, так как каждый сертификат хранится в разных контейнерах и каталогах.
Get-ChildItem -Path "Cert:\" -Recurse | ft
Каждая строка, которая выведена сверху, является объектом. У каждого объекта множество свойств. За срок работы сертификата отвечает свойство "NotAfter".
Кроме того, в примере выше, выводятся объекты, которые не относятся к сертификатам. Их мы уберем указав сравнив их с классом х509 сертификатов - "[System.Security.Cryptography.X509Certificates.X509Certificate2]".
# вывод устаревших сертификатов
Get-ChildItem "cert:\" -Recurse | Where-Object {$_ -is [System.Security.Cryptography.X509Certificates.X509Certificate2] -and $_.NotAfter -lt (Get-Date)} | select -Property "FriendlyName", "NotAfter"
Свойство 'FriendlyName' может пригодится, что бы идентифицировать сертификат. Это поле может быть пустым т.к. формально оно не относится к сертификатам, а имеет отношение к Microsoft Windows и не обязательно для заполнения. Сертификаты без 'FriendlyName' и других полей могут быть просто самоподписанными.
Если 'FriendlyName' пустое, то можно посмотреть свойство 'Subject', которое хранит похожую информацию.
$certs = Get-ChildItem cert:\ -Recurse | Where-Object {$_ -is [System.Security.Cryptography.X509Certificates.X509Certificate2] -and $_.NotAfter -lt (Get-Date)}
$certs | select -Property "FriendlyName", "NotAfter", "Subject"
У сертификата есть множество других характеристик, которые вы можете использоваться для идентификации. Их можно вывести и посмотреть разными способами. В примере ниже, через 'Get-Member', мы выводим все свойства и методы объекта, а через 'select *' - выводим и свойства и значения.
$certs | Get-Member
$certs | select * | select -first 1
Поиск в директориях
Сертификаты располагаются в двух контейнерах:
- CurrentUser - хранилище для текущего пользователя;
- LocalMachine - хранилище для текущей ОС.
В каждом контейнере есть дополнительные директории. Вывести директории можно так:
Get-ChildItem "Cert:\LocalMachine\"
Просмотр устаревших сертификатов в конкретной директории.
$certs = Get-ChildItem "Cert:\LocalMachine\Root\" | Where-Object {$_ -is [System.Security.Cryptography.X509Certificates.X509Certificate2] -and $_.NotAfter -lt (Get-Date)}
$certs | select -Property "FriendlyName", "NotAfter", "Subject"
Поиск сертификатов, которые истекут в ближайшие дни
Для примера поищем сертификаты, которые истекут в ближайшие 60 дней. Для этого, изначально, создадим специальный объект даты с датой, на 60 дней больше текущей. Эту дату мы добавим для сравнения в новое условие.
# В течении какого времени сертификат должен устареть
$exp_days = 60
# Объект с датой
$exp_date = (Get-Date).AddDays($exp_days)
# Поиск
$certs = Get-ChildItem "cert:\" -Recurse | Where-Object {$_ -is [System.Security.Cryptography.X509Certificates.X509Certificate2] -and $_.NotAfter -lt $exp_date -and $_.NotAfter -ge $(Get-Date)}
# Вывод определенных свойств сертификата
$certs | select -Property "FriendlyName", "NotAfter", "Subject"
Если вам нужно найти сертификат, который истек, например, за последние 60 дней, можно использовать пример ниже. В этом случае нам нужно искать сертификаты, которые не меньше указанной даты, и не больше текущей.
# В течение скольких дней сертификат устарел
$exp_days = -60
# Объект с датой
$exp_date = (Get-Date).AddDays($exp_days)
# Поиск
$certs = Get-ChildItem "cert:\" -Recurse | Where-Object {$_ -is [System.Security.Cryptography.X509Certificates.X509Certificate2] -and $_.NotAfter -gt $exp_date -and $_.NotAfter -lt (Get-Date)}
# Вывод определенных свойств сертификата
$certs | select -Property "FriendlyName", "NotAfter", "Subject"
...
Подписывайтесь на наш Telegram канал
Теги: #powershell