Проверьте, является ли данный исполняемый файл цифровой подписью и действительной?

В моем приложении C#/.NET я должен проверить, соответствует ли данный исполняемый файл цифровой подписке (желательно без Exception тестирования.)

Затем мне нужно проверить, действительно ли его сертификат (на основе установленных корневых сертификатов) и , если содержимое файлов допустимо для подписи.

В BCL так много классов, я не знаю, с чего начать и что использовать, и все, что я нашел до сих пор, не устраняет мою путаницу...

Я хотел бы сделать что-то вроде этого без P/Invoke, если возможно:

bool IsSignedFile(string path);  
Cert GetCertificateFromSignedFile(string path);
bool IsValidCertificate(Cert cert)
Sig GetSignatureFromSignedFile(string path);
bool IsValidSignature(string path, Sig sig, Cert cert);  

Добавлено пояснение:

Большая проблема, с которой я сталкиваюсь сейчас, заключается в том, что я не нашел способ получить подпись такого файла в простой форме. Все еще надеюсь, что есть предоставленное, управляемое, BCL решение, поскольку я был бы удивлен, если точно эта часть отсутствует. (Для сертификата это можно сделать только с X509Certificate.CreateFromSignedFile, подтвердив, что это тоже возможно)
Я бы предпочел не смешивать эту 50% -ную работу с кодом P/Invoke или большой библиотекой.

Я нашел класс AuthenticodeSignatureInformation, однако никакой информации об использовании этого для данного исполняемого файла не было.

Ответ 1

Вы можете сделать это, используя только управляемый код. Монопроект имеет собственный signcode и chktrust, которые позволяют вам подписывать и проверять подписи Authenticode (tm).

Оба используют сборку Mono.Security.dll, которая отлично работает под Windows, и весь код лицензируется по лицензии MIT.X11 (так что вы можете в значительной степени делать то, что хотите с ним).

Однако вам потребуется немного дополнительной логики для проверки корневого сертификата, так как Mono использует его собственные магазины - а не тот, что в Windows. Это не должно быть большой проблемой, поскольку .NET(поскольку v2) предоставляет классы, которые запрашивают/получают доступ к хранилищам сертификатов пользователей/машин.

Отказ от ответственности: Я написал большую часть кода выше; -)