【问题标题】:Can you order a X509Certificate2Collection to use the newest certificate?您可以订购 X509Certificate2Collection 以使用最新证书吗?
【发布时间】:2020-07-28 23:21:53
【问题描述】:

我有一组使用代码的证书:

 var set = certStore.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, name, false);

由于我通过其主题名称找到证书,并且证书设置为自动更新并自动下载/安装到机器上 - 有可能会有两个具有相同主题名称的证书商店。 (returnValidOnly 的最后一个参数为 false,因为我认为将其设置为 true 会遇到代码内部检查证书链是否有效的其他问题)

Find 方法如何对返回的证书列表进行排序? set[0] 总是有最新的吗?有没有一种方法可以在不编写手动 O(n^2) 循环的情况下订购此集合中的证书?

【问题讨论】:

    标签: c# .net x509certificate2


    【解决方案1】:

    Find 方法如何对返回的证书列表进行排序?

    最有可能的是,Find 的顺序与进入的顺序相同。因此,隐含的问题是 X509Store.Certificates 集合是如何排序的。 https://sysadmins.lv/retired-msft-blogs/alejacma/how-does-cryptoapi-order-the-certificates-in-the-stores.aspx 建议它是证书的 SHA-1 指纹的十六进制编码的反向字母(考虑到指纹作为存储模型的一部分显示在注册表中,这是有道理的)。这意味着,出于您的目的,该集合是未排序的。

    有没有一种方法可以在不编写手动 O(n^2) 循环的情况下订购此集合中的证书?

    虽然排序很昂贵(不过,最快的通用排序算法是 n log n,而不是 n^2),但选择不是。找到一个集合的最大值只是一个 O(N) 操作:

    X509Certificate2 cert = null;
    
    foreach (X509Certificate2 cur in coll)
    {
        if (cert == null || cert.NotBefore < cur.NotBefore)
        {
            cert = cur;
        }
    }
    
    if (cert == null)
    {
        throw new InvalidOperationException();
    }
    

    此循环假定 NotBefore 值本质上是发布时间(这几乎总是正确的)并且最新的就是您想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多