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