我正在使用证书进行测试。我有以下代码,如果我检查文件夹中的.dll并查看它们是否具有证书。如果它们通过了验证,我将它们添加到部件列表中:
var files = Directory.EnumerateFiles(directory, "*.dll", SearchOption.AllDirectories);
foreach (var file in files)
{
try
{
var cert = new X509Certificate2(X509Certificate.CreateFromSignedFile(file));
if (cert.IsNull() || !cert.Verify() || !PUBLIC_KEY.Equals(cert.GetPublicKeyString()))
{
cert.Dispose();
continue;
}
cert.Dispose();
assemblies.Add(Assembly.LoadFrom(file));
}
catch (CryptographicException)
{
// dll not signed
}
}
但是奇怪的是,如果PC未连接到Internet,则不会将.dll添加到我的程序集中。但是,如果将其连接到Internet并运行我的测试,则带有证书的所有dll都将添加到我的程序集列表中。同样,在断开连接后,我的测试仍然可以进行。因此,它需要一次连接到Internet。我认为这与Verify()函数有关。
有没有办法没有该第一个互联网连接?我想在没有互联网连接的计算机上运行测试。我是一个拥有证书的菜鸟,所以不确定如何解决此问题。
答案 0 :(得分:0)
根据X509Certificate2.Verify()
Performs a X.509 chain validation using basic validation policy.
的文档
(基本)链验证策略具有许多属性,这些属性指示应如何构建链以及应如何验证链中的证书。您的情况是将X509ChainPolicy.RevocationMode
属性的默认值设置为Online
。这是X509Cerificate2.Verify()在没有Internet连接的情况下失败的原因。如果启用了CAPI2登录事件日志,则应该看到已完成的操作,并且吊销信息不可用或无法获取中间CA证书。
您可以使用X509Chain
类,在其中可以设置自己的验证策略,并可以使用X509Chain.Build(X509Certificate2)
方法来从dll验证证书。然后如示例here
X509Chain.ChainElements
的错误信息。
或者您可以使用本机WinVerifyTrust
方法。 Windows使用此方法来验证dll的签名。您可以找到示例here。这是恕我直言,检查DLL签名的正确方法(至少在Windows上是如此)。