如果 dll 上的签名无效,为什么 X509Chain.build() 方法会返回 true?

问题描述 投票:0回答:1

我想使用 X509Chain 类验证 dll 上的签名。到目前为止我尝试过:

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。 我最重要的问题是,当 dll 上的签名无效时,为什么 build() 方法返回 true(我使用十六进制编辑器使其无效并覆盖了文件中的一些字节)

c# certificate digital-signature x509certificate2 x509chain
1个回答
0
投票

您的代码并不尝试检查 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);

Import
方法不再在 .NET Core / .NET 5+ 中运行。您应该将这些行组合到构造函数调用中:

X509Certificate2 intermediateCertificate = new X509Certificate2(intermediateCert);
X509Certificate2 rootCertificate = new X509Certificate2(rootCert);
© www.soinside.com 2019 - 2024. All rights reserved.