Obtener un certificado del almacén de certificados

Creado el día 29/01/2010 10:45 por zorry

Vamos a aprender a leer un certificado del almacén de certificados de Windows. Esta tarea es bastante sencilla. Para poder programar con certificados de usuario X509 sin necesidad de tener que comprar un certificado a una entidad certificadora, podemos crear un certificado de pruebas. Este certificado únicamente nos valdrá en nuestra máquina local, ya que no posee una ruta de certificación completa y puede que en algunos escenarios avanzados no responda correctamente, pero para nuestro uso será más que suficiente.

Para crear el certificado de pruebas emplearemos la utilidad MakeCert.exe, que podremos ejecutar abriendo una línea de comandos de Visual Studio (en mi máquina se localiza en C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin). Esta utilidad tendrá varios parámetros de interés:

  • -sr: En este parámetro especificaremos el almacén donde queremos crear el certificado. Podremos especificar CurrentUser o LocalMachine.
  • -ss: En este parámetro especificaremos la carpeta en el almacén donde queremos crearla. Podremos especificar varios valores, emplearemos My que representa la carpeta de certificados Personal.
  • -a: Algoritmo de hash.
  • -n: Canonical Name del certificado
  • -pe: Hace que la clave privada del certificado sea exportable.

Ejecutaremos la siguiente instrucción:

makecert.exe -sr LocalMachine –ss My -a sha1 -n CN=TestCertificate 
-sky exchange –pe

Una vez instalado el certificado, podremos cargarlo ejecutando la siguiente función:

private static X509Certificate2 getCertificateFromStore(string  
  subjectName)
{
    X509Store store = new X509Store(StoreName.My, 
        StoreLocation.LocalMachine);
    store.Open(OpenFlags.ReadOnly);
    X509Certificate2Collection certs = store.Certificates.Find   
        (X509FindType.FindBySubjectDistinguishedName, 
        subjectName, false);
    return certs[0];
}

En esta función, accedemos al almacén de certificados, especificando el almacén con el enumerado StoreLocation.LocalMachine y la carpeta Personal mediante el enumerado StoreName.My. Posteriormente realizamos una búsqueda del certificado mediante su nombre canónico y devolvemos el primer resultado.

Si queremos cargar el certificado que creamos con MakeCert.exe, sólo tendremos que llamar a este método así:

X509Certificate2 cert = getCertificateFromStore("CN=TestCertificate");

Comentarios no permitidos