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

Мне нужно как-то извлечь эту информацию из файла и проверить, если это правильно. Предпочтительно использовать 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 на базу-64 с сертификатом Windows.

Однако проблема со сценарием disitool заключается в том, что он буквально обрезает байтовый массив «сигнатуры» из самого исполняемого файла с помощью модуля pefile python, что делает извлеченный файл .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')] 

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

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

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

1 ответ1

2

В Powershell:

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

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

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

Поскольку вы запросили детализацию, Get-AuthenticodeSignature возвращает Систему.Управление.Автоматизация.Подпись объекта. Вы можете узнать это несколькими способами. Лично я предпочитаю назначать его переменной, чтобы я мог поиграть с возвращенным объектом дальше. После того, как вы присвоили ей переменную, вы можете узнать о ней кое-что. 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.Объект. Свойства, хотя и интересны. Сертификат Signer выглядит так, как вы хотели, поэтому давайте посмотрим, как это выглядит:

$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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .