Почему метод X509Chain.build() возвращает true, если подпись в dll недействительна?

Я хочу проверить подпись в dll, используя класс X509Chain. Я пробовал это до сих пор:

      X509Certificate2 intermediateCertificate = new X509Certificate2();
X509Certificate2 rootCertificate = new X509Certificate2();
intermediateCertificate.Import(intermediateCert);
rootCertificate.Import(rootCert);

X509Chain certificateChain = new X509Chain();
certificateChain.ChainPolicy.ExtraStore.Add(intermediateCertificate);
certificateChain.ChainPolicy.ExtraStore.Add(rootCertificate);
certificateChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
certificateChain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0);
certificateChain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

X509Certificate2 dllCert= new X509Certificate2("path/To/The/Dll");
bool isCertChainValid = certificateChain.Build(dllCert);

Я работаю над решением, которое работает на машинах, не подключенных к Интернету, поэтому я добавляю сертификаты в дополнительное хранилище и устанавливаю режим отзыва на noCheck. Мой самый важный вопрос: почему метод build() возвращает true, если подпись в dll недействительна (я сделал ее недействительной с помощью шестнадцатеричного редактора и перезаписал некоторые байты в файле)

1 ответ

Ваш код не пытается проверить подпись DLL, он просто спрашивает, является ли сертификат, который утверждает, что подписал DLL, доверенным.

X509Certificate2 dllCert= new X509Certificate2("path/To/The/Dll");находит только элемент данных подписи Authenticode и извлекает сертификат первого подписывающего лица (обычно он только один, но если их несколько, то это первый)... затем полностью забывает о DLL.

Уровень библиотек базовых классов .NET (BCL) не предоставляет возможности проверки подписей Authenticode или политик выполнения приложений.

Дополнительное примечание:

      X509Certificate2 intermediateCertificate = new X509Certificate2();
X509Certificate2 rootCertificate = new X509Certificate2();
intermediateCertificate.Import(intermediateCert);
rootCertificate.Import(rootCert);

The Importметоды больше не работают в .NET Core/.NET 5+. Вам следует просто объединить эти строки в вызов конструктора:

      X509Certificate2 intermediateCertificate = new X509Certificate2(intermediateCert);
X509Certificate2 rootCertificate = new X509Certificate2(rootCert);
Другие вопросы по тегам