Проверка цепочки сертификатов с помощью powershell

Я пытаюсь написать сценарий, который проверяет цепочку сертификатов в PowerShell (что все сертификаты в цепочке не истекли) и находит сертификат, который ближе всего к истечению срока действия. Я использую следующий скрипт для поиска сертификата эмитента:

Get-ChildItem-Recurse-Path Cert: / Where-Object { $_.Тема -экв $сертификат.Эмитент }

по некоторым причинам для некоторых сертификатов я получаю более одного сертификата с разными отпечатками пальцев, которые имеют одинаковый имя эмитента, и я ожидал, что это будет только один.

существует ли какое-либо другое свойство сертификата, которое однозначно идентифицирует сертификат эмитента? Может быть, есть какой-то другой подход для проверки цепочки сертификатов?

2 ответов


проверить тест-сертификат: http://poshcode.org/1633

тестирует указанный сертификат для цепочки сертификатов и отзыва

есть командлет Test-Certificate, включенный в 4.0
http://technet.microsoft.com/en-us/library/hh848639.aspx

Я запустил это на своем localhost, просто тестируя его,

Get-childitem cert: -recurse | %{ write-host $_ ; Test-Certificate -cert $_ }

это дает хорошую ошибку, когда сертификат в цепочке истeкший.

предупреждение: состояние цепи : Cert_trust_is_not_time_valid Test-Certificate: требуемый сертификат не находится в пределах срока его действия при проверке системным часам или по штампу времени в подписанном файле.


Мне нужно было инвентаризировать все сертификаты с закрытыми ключами для дат истечения срока действия. Приведенный ниже пример кода тестируется в Powershell 3.0 Структура Try/Catch позволяет подавлять неприятный красный текст ошибки из сертификатов, которые не имеют закрытых ключей.

Set-Strictmode -Version Latest
$arrCerts = Get-Childitem CERT:\ -Recurse                   
foreach ($objItem in $arrCerts) {
   Try   { $blnFound = ($objItem.HasPrivateKey -eq $True) } 
   Catch { $blnFound = $False }                             
   if ($blnFound) {                                         
       $arrSplit = $objItem.PSParentPath -split "::"        
       write-host 'Path        '$arrSplit[1]                
       write-host 'Subject     '$objItem.SubjectName.Name   
       write-host 'Expires     '$objItem.NotAfter           
       write-host 'Private Key '$objItem.HasPrivateKey      
       write-host
       }
   }