【问题标题】:X509Certificate2Collection.Find() method, using FindByTimeValid criteria, not workingX509Certificate2Collection.Find() 方法,使用 FindByTimeValid 标准,不起作用
【发布时间】:2018-01-19 05:00:51
【问题描述】:

我正在使用以下代码仅获取机器上的有效(按时间)证书:

var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
var storeCol = store.Certificates;
store.Close();

var notExpiredCol = storeCol.Find(X509FindType.FindByTimeValid, DateTime.Now, true);

在我的机器上它运行良好。但是,在另一台具有相同配置(Windows 10、Visual Studio Community 2017 并安装完全相同的证书)的机器上,它什么也不返回。

来自商店的原始集合,没有过滤器,有证书。如果我们查看 Internet Explorer 下的证书,证书就在那里。如果我们在带有证书管理单元的 MMC 下查看,证书就在那里。我们尝试在当前用户和本地机器下安装证书,代码是从当前用户获取证书集合。

我刚刚尝试使用 FindByTimeExpiredFindByTimeNotYetValid 条件,结果相同,都返回一个空集合:

var expiredCol = storeCol.Find(X509FindType.FindByTimeExpired, DateTime.Now, true);
var notYetValidCol = storeCol.Find(X509FindType.FindByTimeNotYetValid, DateTime.Now, true);

有没有人知道发生了什么或者我们可以检查什么来解决问题?

顺便问一下,validOnly 参数在 X509Certificate2Collection.Find() 方法上的具体作用是什么?如果我在其上使用值 false,该方法将返回集合上的证书。

【问题讨论】:

  • validOnly 将导致X509Store.Find 函数在它找到的任何证书上调用Verify。在您的情况下,证书很可能在另一台机器上不受信任。
  • 就是这样,柯克,你已经搞定了,谢谢!关于 X509Certificate2Collection.Find() 方法的 Microsoft 文档应该提到 validOnly 参数的一点特殊性
  • 我查看了该函数的 Mono 源代码并在那里找到了它的用法:github.com/mono/mono/blob/master/mcs/class/System/…
  • 哇,找到答案需要做很多工作! Docs 可以让我们的生活更轻松,不是吗?顺便说一句,你知道微软也提供了 Windows 实现的源代码吗? Herehere.
  • 但是(在 .NET 框架的 Windows 实现的源代码上)找到答案有点复杂。 X509Certificate2Collection.Find()方法调用FindCertInStore()函数,调用FindByCert()函数,最后调用X509Utils.VerifyCertificate()。但是X509Utils 是一个内部类……在 Mono 源代码上,更容易理解发生了什么。再次感谢柯克。

标签: c# .net certificate x509certificate2


【解决方案1】:

@Kirk Larkin 在他的评论中解决了这个问题。

validOnly 参数设置为 true 导致 X509Certificate2Collection.Find() 方法在它找到的任何证书上调用 X509Certificate2.Verify() 方法(只是不知道为什么文档没有提到那个小特殊性不过),并且该方法执行 X.509 链验证。

在那台机器上,没有安装证书链中的一个受信任的根证书颁发机构,因此该证书被视为不受信任。我们已经安装了缺少的链证书,现在它运行良好。

因此,在我们的案例中,最好不要使用设置为 truevalidOnly 参数。

【讨论】:

猜你喜欢
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
相关资源
最近更新 更多