X509Certificate2.Verify() 行为首次使用

Posted

技术标签:

【中文标题】X509Certificate2.Verify() 行为首次使用【英文标题】:X509Certificate2.Verify() behaviour first time usage 【发布时间】:2019-02-10 08:21:51 【问题描述】:

如果我使用证书,我正在做一个测试。如果我检查文件夹中的 .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() 函数有关。

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

【问题讨论】:

为什么跟随会失败? PUBLIC_KEY.Equals(cert.GetPublicKeyString())。验证检查证书是否可读(存在,请参阅docs.microsoft.com/en-us/dotnet/api/…)因此证书不为空。可读,证书通过签名加密测试。没有任何东西可以检查互联网。 【参考方案1】:

根据X509Certificate2.Verify()Performs a X.509 chain validation using basic validation policy.的文档

(基本)链验证策略有许多属性来说明应该如何构建链以及应该如何验证链中的证书。在您的情况下,X509ChainPolicy.RevocationMode 属性的默认值设置为Online。这就是 X509Cerificate2.Verify() 在没有互联网连接的情况下失败的原因。如果您在事件日志中启用 CAPI2 登录,您应该会看到已完成的操作以及吊销信息不可用或无法获取中间 CA 证书。

您可以使用X509Chain 类来设置您自己的验证策略和X509Chain.Build(X509Certificate2) 方法来验证来自dll 的证书。然后检查X509Chain.ChainElements 以获取错误信息,如示例here 中所示

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

【讨论】:

这几乎没有帮助,因为X509Chain.Build 将在没有网络连接的情况下以RevocationOffline 状态失败。 @Crypt32 你是对的。如果中间 CA 尚未存储,那么它将在链构建时失败。但总是有WinVerifyTrust 选项。 @Crypt32 是的,我已经尝试过该选项。 pepo 我会回到你的“WinVerifyTrust”解决方案。我还有一些其他的事情要做。但我会调查“WinVeryTrust”选项。

以上是关于X509Certificate2.Verify() 行为首次使用的主要内容,如果未能解决你的问题,请参考以下文章

X509Certificate2.Verify() 出错但证书正在工作

X509Certificate2.Verify()行为首次使用

X509_STORE 和 X509_STORE_CTX 有啥区别?

x509证书格式

x509的简介

X.509