Почему метод 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);