2009-07-30 12 views
26
abrufen

Für eine sichere Anwendung muss ich ein Zertifikat in einem Dialogfeld auswählen. Wie kann ich mit C# auf den Zertifikatspeicher oder einen Teil davon (z. B. storeLocation="Local Machine" und storeName="My") zugreifen und eine Sammlung aller Zertifikate von dort abrufen? Vielen Dank im Voraus für Ihre Hilfe.Liste der Zertifikate aus dem Zertifikatspeicher in C#

Antwort

4

Ja - die X509Store.Certificates-Eigenschaft gibt einen Snapshot des X.509-Zertifikatsspeichers zurück.

45
X509Store store = new X509Store("My"); 

store.Open(OpenFlags.ReadOnly); 

foreach (X509Certificate2 mCert in store.Certificates){ 
    //TODO's 
} 
+9

Um Tippfehler auszuschließen, sollten Sie die Enumerationen StoreName und StoreLocation verwenden. –

13

Try this:

//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; 
} 
+9

Linq macht dies einfacher: x509Store.Certificates.OfType (). FirstOrDefault (cert => cert.IssuerName.Name.EndsWith ("DC = mysite, DC = com")); –

+0

@ JonathanDeMarks: was genau bedeutet das "" DC = mysite, DC = com "" hier bedeuten? Keines dieser Beispiele scheint zu zeigen, wie man ein _spezifisches_ Zertifikat bekommt ... – Nyerguds

+0

@Nyerguds Die Frage ist: Holen Sie sich die Liste der Zertifikate aus dem Zertifikatsspeicher in C#, nicht spezifisch. Bitte, erstellen Sie eine weitere Frage. – Cobaia

7

Der einfachste Weg, dies zu tun, ist durch den Zertifikatspeicher Öffnen Sie wollen und dann X509Certificate2UI verwenden.

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

Weitere Informationen in X509Certificate2UI on MSDN.

+1

Um 'X509Certificate2UI' zu verwenden, muss ich einen Verweis auf' System.security.dll' hinzufügen, dies funktioniert jedoch wie ein Charm +1 ':)'. Um einen Benutzer Keystore zu verwenden, verwende ich 'StoreLocation.CurrentUser' anstelle von' StoreLocation.LocalMachine'. – albciff

Verwandte Themen