X509Certificate2Collection.Find() 方法,使用 FindByTimeValid 标准,不起作用

X509Certificate2Collection.Find() method, using FindByTimeValid criteria, not working

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

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 并且安装了完全相同的证书),它 returns 什么都没有。

来自商店的 collection 原件,没有过滤器,有证书。如果我们在 Internet Explorer 下查看证书,证书就在那里。如果我们查看带有证书 snap-in 的 MMC,证书就在那里。我们尝试在当前用户和本地计算机下安装证书,代码正在从当前用户获取证书 collection。

我刚刚尝试使用 FindByTimeExpiredFindByTimeNotYetValid 标准,结果相同,都是 returns 一个空的 collection:

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

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

顺便问一下,validOnly参数对X509Certificate2Collection.Find()方法的作用到底是什么?如果我使用值 false 就可以了,方法 returns 证书就 collection.

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

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

在那台机器上,证书链中的一个 Trusted Root Certification Authority 没有安装,因此,该证书被视为不受信任。我们已经安装了丢失的链证书,现在它运行良好。

因此,在我们的案例中,最好不要将 validOnly 参数设置为 true