X509Certificate2.Verify()行为首次使用

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

我正在进行测试,我使用的是证书。我有以下代码,我检查.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
   }
}

但奇怪的是,如果电脑没有连接到互联网,它将不会将.dll添加到我的程序集。但是如果它连接到互联网并且我运行我的测试,所有带有证书的dll都会添加到我的程序集列表中。断开连接后,我的测试仍然有效。所以它需要一次连接到互联网。我认为它与Verify()函数有关。

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

c# dll certificate x509certificate x509certificate2
1个回答
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的证书。然后检查X509Chain.ChainElements以获取错误信息,如示例here所示

或者你可以使用原生的WinVerifyTrust方法。 Windows使用此方法来验证dll的签名。你可以找到一个例子here。这是恕我直言,检查dll签名的正确方法(至少在Windows上)。

© www.soinside.com 2019 - 2024. All rights reserved.