2011-01-19 66 views
21

Estoy intentando exportar un certificado sin la clave privada como archivo BASE-64 codificado, lo mismo que exportarlo desde Windows. Cuando se exporta desde Windows, puedo abrir el archivo .cer en el bloc de notas.Exportación de un certificado codificado según BASE-64 .cer

Cuando intento lo siguiente y abro en el bloc de notas obtengo datos binarios ... Creo que es ... no legible. .

X509Certificate2 cert = new X509Certificate2("c:\\myCert.pfx", "test", X509KeyStorageFlags.Exportable); 

File.WriteAllBytes("c:\\testcer.cer", cert.Export(X509ContentType.Cert)); 

traté de retirar la 'X509KeyStorageFlags.Exportable", pero eso no funciona me estoy perdiendo algo

Editar -? Me trataron

File.WriteAllText("c:\\testcer.cer",Convert.ToBase64String(cert.Export(X509ContentType.Cert))) 

y que parece que funciona, sin embargo , falta el "----- BEGIN CERTIFICATE -----" y "----- END CERTIFICATE -----"

+0

Debido al marco mono obsoleto estoy obligado a utilizar, recurrí a llamar openssl como un proceso externo: 'openssl pkcs12 -en ImportPath -nokeys -passin pasar:' - esto funciona en Linux y Windows openssl binarios – Rbjz

Respuesta

45

Quizás

/// <summary> 
/// Export a certificate to a PEM format string 
/// </summary> 
/// <param name="cert">The certificate to export</param> 
/// <returns>A PEM encoded string</returns> 
public static string ExportToPEM(X509Certificate cert) 
{ 
    StringBuilder builder = new StringBuilder();    

    builder.AppendLine("-----BEGIN CERTIFICATE-----"); 
    builder.AppendLine(Convert.ToBase64String(cert.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks)); 
    builder.AppendLine("-----END CERTIFICATE-----"); 

    return builder.ToString(); 
} 
+2

Este método también podría ofrecerse como un método de extensión colocándolo en una clase estática y cambiando su firma a: 'cadena estática pública ExportToPEM (este certificado X509Certificate)' –

2

probar esto:

X509Certificate2 cerifikata = new X509Certificate2("C://certificate.pfx"); 
File.WriteAllBytes("D://Test.cer",cerifikata.Export(X509ContentType.Cert)); 
0

// Sin embargo, falta la "----- BEGIN CERTIFICATE -----" y "----- END CERTIFICATE -----"

Estas líneas faltantes son opcionales. CA puede generarlos o no según la configuración. Por todos los motivos prácticos, pueden eliminarse del archivo codificado en Base64.

1

Para aquellos que implementan algo similar en .NET Core, aquí está el código, basado en lo que hizo el tiránido. Base64FormattingOptions.InsertLineBreaks no existe en .NET Core, así que tuve que implementar mi propia forma de hacer el salto de línea.

// Certificates content has 64 characters per lines 
    private const int MaxCharactersPerLine = 64; 

    /// <summary> 
    /// Export a certificate to a PEM format string 
    /// </summary> 
    /// <param name="cert">The certificate to export</param> 
    /// <returns>A PEM encoded string</returns> 
    public static string ExportToPem(this X509Certificate2 cert) 
    { 
     var builder = new StringBuilder(); 
     var certContentBase64 = Convert.ToBase64String(cert.Export(X509ContentType.Cert)); 
     // Calculates the max number of lines this certificate will take. 
     var certMaxNbrLines = Math.Ceiling((double)certContentBase64.Length/MaxCharactersPerLine); 

     builder.AppendLine("-----BEGIN CERTIFICATE-----"); 
     for (var index = 0; index < certMaxNbrLines; index++) 
     { 
      var maxSubstringLength = index * MaxCharactersPerLine + MaxCharactersPerLine > certContentBase64.Length 
       ? certContentBase64.Length - index * MaxCharactersPerLine 
       : MaxCharactersPerLine; 
      builder.AppendLine(certContentBase64.Substring(index * MaxCharactersPerLine, maxSubstringLength)); 
     } 
     builder.AppendLine("-----END CERTIFICATE-----"); 

     return builder.ToString(); 
    } 
+0

¡¡¡Gracias !!! Eso funciono :) –

Cuestiones relacionadas