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

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

Поскольку мне нужно получить список, от каких корневых сертификатов, отличных от Microsoft, зависят определенные исполняемые файлы (в установленном программном обеспечении). Это связано с базовыми рекомендациями по ОС, в которых используется процедура PKI в Microsoft KB293781. Где на конкретные компьютеры должны ставиться только определенные Root-сертификаты. Например, часто используемый «Первичный ЦС VeriSign класса 3 — G5» следует использовать только при необходимости.

Get-AuthenticodeSignature перечисляет только эмитента. Например: Get-AuthenticodeSignature C:\windows\system32\MRT.exe

Такие инструменты, как "SysInternals SigCheck", могут это сделать sigcheck.exe -i C:\windows\System32\mrt.exe, и эта информация может быть проанализирована в дальнейшем. Также эту информацию могут получить другие инструменты, такие как SignTool.exe из Windows SDK и AnalyzePESig от Дидье Стивенса.

Но можно ли это сделать, используя только PowerShell? Возможно, используя WinVerifyTrust API в Windows. https://msdn.microsoft.com/en-us/library/windows/desktop/aa382384(v=vs.85).aspx http://support2.microsoft.com/kb/323809/en-us

Привет, Текк


person ledetekst    schedule 23.01.2015    source источник


Ответы (1)


Это должно быть возможно при доступе к .NET непосредственно в PowerShell. Вот фрагмент, который я набросал, используя пример файла, на который вы ссылались в своем вопросе:

# Get a X590Certificate2 certificate object for a file
$cert = (Get-AuthenticodeSignature -FilePath C:\windows\system32\MRT.exe).SignerCertificate
# Create a new chain to store the certificate chain
$chain = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Chain
# Build the certificate chain from the file certificate
$chain.Build($cert)
# Return the list of certificates in the chain (the root will be the last one)
$chain.ChainElements | ForEach-Object {$_.Certificate}

Это дает вам то, что вы искали?

person Kirk Munro    schedule 23.01.2015
comment
Этот метод работает только в том случае, если Windows подключена к Интернету и может разрешать CTL / OCSP, что невозможно в среде. Включил ведение журнала для CAPI2 в средстве просмотра событий и получил следующее (сокращенное): ‹code› Имя: Microsoft-Windows-CAPI2 EventID: 30 UserData — результат Не удалось создать цепочку сертификатов для доверенного корневого центра. EventID: 11 — RevocationResult Функция отзыва не смогла проверить отзыв, так как сервер отзыва был отключен. - Результат Не удалось создать цепочку сертификатов для доверенного корневого центра. - person ledetekst; 27.01.2015