2009-07-30 53 views
26

Para una aplicación segura, necesito seleccionar un certificado en un cuadro de diálogo. ¿Cómo puedo acceder a la tienda de certificados o a una parte de ella (por ejemplo, storeLocation="Local Machine" y storeName="My") usando C# y obtener una colección de todos los certificados desde allí? Gracias de antemano por tu ayuda.Obtener una lista de certificados del almacén de certificados en C#

Respuesta

4

Sí, la propiedad X509Store.Certificates devuelve una instantánea del almacén de certificados X.509.

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

store.Open(OpenFlags.ReadOnly); 

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

Para eliminar la posibilidad de errores tipográficos, debe usar las enumeraciones: StoreName y StoreLocation. –

13

Prueba esto:

//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 lo hace más fácil: x509Store.Certificates.OfType (). FirstOrDefault (cert => cert.IssuerName.Name.EndsWith ("DC = mysite, DC = com")); –

+0

@JonathanDeMarks: ¿qué significa exactamente el '" DC = mysite, DC = com "' aquí? Ninguno de estos ejemplos parece mostrar cómo obtener un certificado _specific_ ... – Nyerguds

+0

@Nyerguds La pregunta es: Obtenga una lista de certificados del almacén de certificados en C#, no específicos. Por favor, crea otra pregunta. – Cobaia

7

La forma más sencilla de hacerlo es mediante la apertura del almacén de certificados que desea y luego usando X509Certificate2UI.

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

Más información en X509Certificate2UI on MSDN.

+1

Para usar 'X509Certificate2UI' Necesito agregar una referencia a' System.security.dll', sin embargo esto funciona como un charm +1 ':)'. También para usar un keystore de usuario utilizo 'StoreLocation.CurrentUser' en lugar de'StoreLocation.LocalMachine'. – albciff

Cuestiones relacionadas