Я пишу функцию для DLL установщика, чтобы проверить подпись Authenticode EXE-файлов, уже установленных в системе.
Функция должна:
A) verify that the signature is valid.
B) verify that the signer is our organization.
Поскольку это находится в установщике и потому что это нужно запускать на более старых установках Win2k, я, не, хочу полагаться на CAPICOM.dll, так как его может не быть в целевой системе.
API WinVerifyTrust отлично справляется с решением (A).
Мне нужно найти способ сравнить известный сертификат (или его свойства) с тем, который подписал рассматриваемый EXE.
@bobince, Mono имеет инструменты код знака и chktrust, которые работают (если вы устанавливаете необходимые корневые сертификаты) на каждой платформе, поддерживаемой Mono (S390x, если хотите ;-)





Если подпись действительна, ее цепочка сертификатов будет содержать ваш сертификат. CertGetCertificateChain получит эту цепочку.
Вы имеете в виду, что структура WINTRUST_DATA содержит сертификат? Или, возможно, CertGetCertificateChain можно использовать непосредственно в файле - я просто не могу понять, как это сделать. Должно быть, я упускаю что-то очевидное. Заранее благодарим за подробности.
Вы должны использовать CryptQueryObject.
В этой статье базы знаний показано использование: Как получить информацию из исполняемых файлов, подписанных Authenticode.
Комментатору, который спросил, как это сделать без Windows-API, я не знаю ни одной библиотеки, которая может это сделать, но формат задокументирован здесь: Формат переносимой исполняемой подписи Windows Authenticode
+1 ... если кто-нибудь сможет придумать библиотеку, которая будет делать это даже на платформе, отличной от Windows, я буду счастлив. Я хотел бы иметь возможность проверить, что .EXE подписан Microsoft изнутри Linux.