visual usuario studio gratis generar equipo crear consumir con cliente certificado autenticacion actual c# pfx x509certificate2 pkcs#12

c# - usuario - generar certificado crt



¿Cómo importar mediante programación una pfx con una cadena de certificados en el almacén de certificados? (4)

Debería poder iterar sobre los certificados de su PFX (e importar cada uno al almacén de certificados de su elección) abriendo el archivo PFX como un objeto X509Certificate2Collection.

Aquí están los documentos en X509Certificate2Collection:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2collection.aspx

MSDN proporciona algún código de muestra en esa página de documentos sobre cómo inspeccionar cada certificado en la colección.

Una vez que conozca los CN / Emisores / otra información sobre cada certificado, debe quedar claro a qué almacén de certificados se debe agregar cada uno. Para eso puede usar la clase X509Store y la enumeración StoreName para especificar qué tienda desea abrir / agregar a:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store.aspx

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.storename.aspx

También vea mi respuesta a una pregunta similar de SO:

¿Cómo recuperar certificados de un archivo pfx con c #?

Como se mencionó en uno de los últimos comentarios sobre esa respuesta, cuando intente importar un certificado al almacén raíz del usuario actual ("StoreName.Root" y "StoreLocation.CurrentUser" como nombre / ubicación) aparecerá un cuadro de diálogo emergente que le preguntará usted para confirmar.

Para resolverlo, acabo de agregar un pequeño código de MS UI Automation a mi método de importación de certificados, para hacer clic en Aceptar en el indicador.

O, como dice el comentarista "CodeWarrior" en el comentario de la otra SO, para evitar el cuadro de diálogo emergente, puede intentar colocar el certificado raíz en la tienda LocalMachine en lugar de CurrentUser.

Código de muestra:

string certPath = <YOUR PFX FILE PATH>; string certPass = <YOUR PASSWORD>; // Create a collection object and populate it using the PFX file X509Certificate2Collection collection = new X509Certificate2Collection(); collection.Import(certPath, certPass, X509KeyStorageFlags.PersistKeySet); foreach (X509Certificate2 cert in collection) { Console.WriteLine("Subject is: ''{0}''", cert.Subject); Console.WriteLine("Issuer is: ''{0}''", cert.Issuer); // Import the certificate into an X509Store object }

Estoy intentando importar mediante programación un certificado X509 (pfx / PKCS # 12) en el almacén de certificados de mi máquina local. Este certificado en particular tiene una cadena de certificados, la ruta de certificación se parece a esto:

  • Certificado raíz CA
    • Certificado de organización CA
      • Certificado de organización 2 CA
        • Mi certificado

El código que uso se ve así:

cert = new X509Certificate2(pathToCert, password); if (cert != null) { var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); store.Open(OpenFlags.ReadWrite); if (!store.Certificates.Contains(cert)) { store.Add(cert); } }

Este código importa el certificado, sin embargo, parece ignorar la cadena. Si reviso el certificado en la tienda, la ruta de certificación solo muestra:

  • Mi certificado

Sin embargo, cuando importo el pfx manualmente, muestra la ruta completa. ¿Me estoy saltando un paso aquí, o me estoy perdiendo algún parámetro? ¿Alguien puede arrojar algo de luz sobre esto?


Para cualquier persona que quiera una solución genérica de código "para la tienda apropiada"

Esto es lo que he creado usando VB, por lo que no debería ser difícil de portar a C #. Utilicé las publicaciones anteriores para comenzar y soy un NooB total en esto.

Dim certPath = "C:/Users/08353153/Documents/Visual Studio 2015/Projects/WindowsApplication2/WindowsApplication2/bin/Debug/8870-thebigchess.pfx" Dim certPass = "eduSTAR.NET" Dim Collection As New X509Certificate2Collection Collection.Import(certPath, certPass, X509KeyStorageFlags.PersistKeySet) Dim certOne As X509Certificate2 = Collection(0) Dim certTwo As X509Certificate2 = Collection(2) Dim certThree As X509Certificate2 = Collection(1) Dim personal As New X509Store(StoreName.My, StoreLocation.LocalMachine) personal.Open(OpenFlags.ReadWrite) personal.Add(certOne) personal.Close() Dim trust As New X509Store(StoreName.Root, StoreLocation.LocalMachine) trust.Open(OpenFlags.ReadWrite) trust.Add(certTwo) trust.Close() Dim intermed As New X509Store(StoreName.CertificateAuthority, StoreLocation.LocalMachine) intermed.Open(OpenFlags.ReadWrite) intermed.Add(certThree) intermed.Close()


Para futuras referencias, descubrí otra forma de hacer esto, usando el objeto X509Chain:

var cert = new X509Certificate2(pathToCert, password); X509Chain chain = new X509Chain(); chain.Build(cert); for (int i = 0; i < chain.ChainElements.Count; i++) { //add to the appropriate store }


Un certificado X.509 contiene solo una cadena que lo enlaza con el certificado raíz (incluidas las autoridades intermedias), pero estos certificados no están contenidos en el certificado. Esta cadena se utiliza cuando se valida un certificado final (que no está autofirmado); debe llevar a un certificado raíz de confianza. Más precisamente, la clave pública de cada CA se utiliza para decodificar y verificar el hash para un certificado emitido. Este proceso se repite hasta que se alcanza el certificado raíz. Después de verificar toda la cadena, si el certificado raíz es de confianza, el certificado final también es de confianza. Por supuesto, el proceso también incluye otras validaciones (como fecha de inicio, fecha de finalización, lista de revocación de certificados, por ejemplo), pero solo he detallado la parte relacionada con el uso de la cadena.

Por lo tanto, ha importado correctamente "Mi certificado" junto con la cadena a "CA raíz del certificado". Esta cadena está codificada en "Mi certificado" y puede confirmar esto viendo sus propiedades, pero esta cadena es solo un enlace y no lo hace. contiene cualquiera de los certificados "Certificado raíz CA", "Certificado de organización CA" y "Certificado de organización 2".

Espero que esto resuelva su problema, pero si no lo hace, ¿podría ser más específico acerca de lo que está tratando de lograr?