2009-07-30 17 views
26

Per un'applicazione protetta, è necessario selezionare un certificato in una finestra di dialogo. Come posso accedere all'archivio certificati o parte di esso (ad esempio storeLocation="Local Machine" e storeName="My") utilizzando C# e ottenere una raccolta di tutti i certificati da lì? Grazie in anticipo per il vostro aiuto.Ottieni l'elenco dei certificati dall'archivio certificati in C#

risposta

4

Sì: la proprietà X509Store.Certificates restituisce un'istantanea dell'archivio certificati X.509.

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

store.Open(OpenFlags.ReadOnly); 

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

Per eliminare la possibilità di errori di battitura dovresti usare le enumerazioni: StoreName e StoreLocation. –

13

Prova questo:

//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 semplifica la procedura: x509Store.Certificates.OfType (). FirstOrDefault (cert => cert.IssuerName.Name.EndsWith ("DC = mysite, DC = com")); –

+0

@JonathanDeMarks: cosa significa esattamente "" DC = mysite, DC = com "' significa qui? Nessuno di questi esempi sembra mostrare come ottenere un certificato _specific_ ... – Nyerguds

+0

@Nyerguds La domanda è: ottenere l'elenco dei certificati dall'archivio certificati in C#, non specifico. Per favore, crea un'altra domanda. – Cobaia

7

Il modo più semplice per farlo è con l'apertura dei certificati che si desidera e quindi utilizzando X509Certificate2UI.

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

Ulteriori informazioni in X509Certificate2UI on MSDN.

+1

Per usare 'X509Certificate2UI' ho bisogno di aggiungere un riferimento a' System.security.dll', tuttavia funziona come un fascino +1 ':)'. Inoltre, per utilizzare un keystore utente, utilizzo 'StoreLocation.CurrentUser' anziché'StoreLocation.LocalMachine'. – albciff