Программное получение данных сертификата исполняемого файла

Программное получение данных сертификата исполняемого файла

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

Мне нужно как-то извлечь эту информацию из файла и проверить ее правильность. Предпочтительно использовать Python/CMD/PowerShell

Что мне нужно

РЕДАКТИРОВАТЬ:

Извините за отсутствие подробностей.

В настоящее время я использую этот скрипт Python (который я модифицировал для работы на Python 3.6):http://www.zedwood.com/article/python-openssl-x509-parse-certificateдля анализа файла .cer, который я извлек из исходного исполняемого файла с помощью этого небольшого инструмента, который я нашел (который я также модифицировал для работы с Python 3):https://blog.didierstevens.com/programs/disitool/но только после того, как я преобразую его из двоичного файла в кодировке DER в base-64 с помощью Windows certutil.

Однако проблема со скриптом disitool заключается в том, что он буквально ВЫРЕЗАЕТ массив байтов «подписи» из самого исполняемого файла с помощью модуля Python pefile, что делает извлеченный файл .cer недействительным, как и ошибка Python, которую я постоянно получаю при попытке загрузить сертификат с помощью модуля OpenSSL.crypto:

 [('asn1 encoding routines', 'asn1_check_tlen', 'wrong tag'), ('asn1 encoding routines', 'asn1_item_embed_d2i', 'nested asn1 error'), ('asn1 encoding routines', 'asn1_template_noexp_d2i', 'nested asn1 error'), ('PEM routines', 'PEM_ASN1_read_bio', 'ASN1 lib')] 

Но парсинг хорошего извлеченного сертификата (с помощью первого скрипта, который я разместил выше) работает, как вы можете видеть здесь:

Парсинг работает отлично]

Итак, мне просто нужен способ извлечь сертификат из исполняемого файла, я полагаю. Или, если вы нашли мое решение слишком сложным, если у вас есть какие-либо идеи, как я могу получить этот текст "Redmond" из поля "Тема" сертификата, я очень открыт для идей :)

решение1

В PowerShell:

Get-AuthenticodeSignature C:\Path\TO\File.exe

Итак, используя ваш пример explorer.exe, мы получим Редмонд:

(Get-AuthenticodeSignature C:\Windows\explorer.exe).SignerCertificate.subject.split(',')[2].split('=')[1]

Поскольку вы просили уточнить, Get-AuthenticodeSignatureвозвращает объект System.Management.Automation.Signature. Вы можете узнать это несколькими способами. Лично я предпочитаю назначать его переменной, чтобы иметь возможность поиграться с возвращаемым объектом дальше. После того, как вы назначили его переменной, вы можете узнать о нем кое-что. Get-Memberдолжен быть одним из ваших командлетов в Powershell. В этом случае:

$foo = Get-AuthenticodeSignature C:\Windows\explorer.exe
Get-Member -InputObject $foo
   TypeName: System.Management.Automation.Signature

Name                   MemberType Definition
----                   ---------- ----------
Equals                 Method     bool Equals(System.Object obj)
GetHashCode            Method     int GetHashCode()
GetType                Method     type GetType()
ToString               Method     string ToString()
IsOSBinary             Property   bool IsOSBinary {get;}
Path                   Property   string Path {get;}
SignatureType          Property   System.Management.Automation.SignatureType SignatureType {get;}
SignerCertificate      Property   System.Security.Cryptography.X509Certificates.X509Certificate2 SignerCertificate {...
Status                 Property   System.Management.Automation.SignatureStatus Status {get;}
StatusMessage          Property   string StatusMessage {get;}
TimeStamperCertificate Property   System.Security.Cryptography.X509Certificates.X509Certificate2 TimeStamperCertific...

Итак, вы видите, что у объекта есть некоторые методы и некоторые свойства (я знаю, у всех объектов они есть). В этом случае методы все стандартные, которые унаследованы от System.Object. Однако свойства интересны. SignerCertificate выглядит как то, что вы хотели, так что давайте посмотрим, как это выглядит:

$foo.SignerCertificate


Thumbprint                                Subject
----------                                -------
419E77AED546A1A6CF4DC23C1F977542FE289CF7  CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US

Отпечаток пальца, очевидно, важен, потому что это то, что идентифицирует сертификат, но вы спрашивали о Redmond, который есть в теме. Так что теперь мы знаем, как получить его в виде строки:

$foo.SignerCertificate.Subject

Так что отсюда следует просто прямой анализ строки.

Еще один интересный момент, который я вам подкину, поскольку, похоже, вы изучаете Powershell. Еще один командлет, который вам стоит регулярно пробовать, — Get-Command. В данном случае я даже не знал, что командлет Get-AuthenticodeSignature существует до того, как вы задали вопрос. Поэтому я сделал следующее:

Get-Command *signature*

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Update-MpSignature                                 1.0        Defender
Cmdlet          Get-AuthenticodeSignature                          3.0.0.0    Microsoft.PowerShell.Security
Cmdlet          Save-VolumeSignatureCatalog                        1.0.0.0    ShieldedVMDataFile
Cmdlet          Set-AuthenticodeSignature                          3.0.0.0    Microsoft.PowerShell.Security

решение2

в powershell: вы можете использовать запятую в CN, тогда это сработало для меня:

(Get-AuthenticodeSignature C:\Windows\explorer.exe).SignerCertificate.subject.split('=')[1].split('"=')[1]

Связанный контент