从 C# 中的证书存储中获取证书列表

Posted

技术标签:

【中文标题】从 C# 中的证书存储中获取证书列表【英文标题】:Get list of certificates from the certificate store in C# 【发布时间】:2010-11-15 08:56:52 【问题描述】:

对于安全应用程序,我需要在对话框中选择一个证书。 如何使用 C# 访问证书存储或其一部分(例如 storeLocation="Local Machine"storeName="My")并从那里获取所有证书的集合?提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

是——X509Store.Certificates 属性返回 X.509 证书存储的快照。

【讨论】:

【参考方案2】:
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);

store.Open(OpenFlags.ReadOnly);

foreach (X509Certificate2 certificate in store.Certificates)
    //TODO's

【讨论】:

【参考方案3】:

试试这个:

//using System.Security.Cryptography.X509Certificates;
public static X509Certificate2 selectCert(StoreName store, StoreLocation location, string windowTitle, string windowMsg)


    X509Certificate2 certSelected = null;
    X509Store x509Store = new X509Store(store, location);
    x509Store.Open(OpenFlags.ReadOnly);

    X509Certificate2Collection col = x509Store.Certificates;
    X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(col, windowTitle, windowMsg, X509SelectionFlag.SingleSelection);

    if (sel.Count > 0)
    
        X509Certificate2Enumerator en = sel.GetEnumerator();
        en.MoveNext();
        certSelected = en.Current;
    

    x509Store.Close();

    return certSelected;

【讨论】:

Linq 使这更容易:x509Store.Certificates.OfType().FirstOrDefault(cert => cert.IssuerName.Name.EndsWith("DC=mysite, DC=com")); @JonathanDeMarks:"DC=mysite, DC=com" 在这里究竟意味着什么?这些示例似乎都没有显示如何获得 specific 证书... @Nyerguds 问题是:从 C# 中的证书存储中获取证书列表,而不是具体的。请创建另一个问题。【参考方案4】:

最简单的方法是打开所需的证书存储,然后使用X509Certificate2UI

var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var selectedCertificate = X509Certificate2UI.SelectFromCollection(
    store.Certificates, 
    "Title", 
    "MSG", 
    X509SelectionFlag.SingleSelection);

X509Certificate2UI on MSDN 中的更多信息。

【讨论】:

要使用X509Certificate2UI,我需要添加对System.security.dll 的引用,但这就像一个魅力+1 :)。另外要使用用户密钥库,我使用StoreLocation.CurrentUser 而不是StoreLocation.LocalMachine【参考方案5】:

上述问题的示例。

    public List<string> getListofCertificate()
    
        var certificates = new List<string>();
        X509Store store = new X509Store(StoreLocation.CurrentUser);
        try
        
            store.Open(OpenFlags.ReadOnly);

            // Place all certificates in an X509Certificate2Collection object.
            X509Certificate2Collection certCollection = store.Certificates;
            foreach (X509Certificate2 x509 in certCollection)
                
                    Console.WriteLine(x509.IssuerName.Name);
                    certificates.Add(x509.IssuerName.Name);
                
        
        finally
        
            store.Close();
        
        return certificates;

    

【讨论】:

以上是关于从 C# 中的证书存储中获取证书列表的主要内容,如果未能解决你的问题,请参考以下文章

从SST通过脚本安装证书,自动选择证书存储

使用 C# 从 CA 证书为设备创建 X509 证书

试图理解 Java 中的 SSL 证书

从 https 站点获取证书

如何使用 c# 以编程方式将证书安装到本地机器存储中?

将 Windows 证书存储中的证书和私钥与 OpenSSL 一起使用