如何使用友好名称而不是指纹获取 X509Certificate?

how to get X509Certificate using Friendly Name rather than Thumbprint?

我有一个也有友好名称的证书,我想使用友好名称而不是指纹来获取证书。我没有看到类似 FindByFriendlyName... 的任何方法,该怎么做?

 var thumbprint ="f454......"
 var friendlyName = "ASP.NET Core...."    

 X509Certificate2Collection signingCerts = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);
            X509Certificate2Enumerator enumerator = signingCerts.GetEnumerator();

内置搜索只能针对静态字段进行,对于任何给定的证书都不会改变。友好名称不是静态的,可以无限次更改任何单个证书。因此,我强烈建议不要依赖证书友好名称。曾经。

您可以通过枚举所有证书并检查匹配的证书来进行手动过滤,但这是一种非常糟糕且脆弱的方法。

如果您想要在证书续订期间具有稳定搜索值且易于阅读的内容,您可以尝试使用主题名称(如果证书具有合适的主题名称,而不是 localhost 或其他名称):

var subject ="org name signing cert......"
var friendlyName = "ASP.NET Core...."    

X509Certificate2Collection signingCerts = store.Certificates.Find(X509FindType.FindBySubjectName, subject, true);
        X509Certificate2Enumerator enumerator = signingCerts.GetEnumerator();

(您可能也只需要 valid/non-expired 证书,因此对最后一个参数使用 true。)

我有一个用例可以通过 FriendlyName 查找。代码如下

            //store variable 
            X509Store store;
            //certificate variable 
            X509Certificate2 cert;

            //init store using root and local machine
            store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
            //open store for read only
            store.Open(OpenFlags.ReadOnly);
            //find cert using linq
            cert = store.Certificates.OfType<X509Certificate2>().FirstOrDefault(x => x.FriendlyName == "cert-friendlyname-here");
            //close store
            store.Close();