X509Certificate2.Verify()行为首次使用

时间:2018-09-05 08:45:37

标签: c# dll certificate x509certificate x509certificate2

我正在使用证书进行测试。我有以下代码,如果我检查文件夹中的.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()函数有关。

有没有办法没有该第一个互联网连接?我想在没有互联网连接的计算机上运行测试。我是一个拥有证书的菜鸟,所以不确定如何解决此问题。

1 个答案:

答案 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上是如此)。