c# .net base64 x509certificate x509certificate2

c# - Exportando un certificado como.cer codificado en BASE-64



decode text (4)

// sin embargo, falta el "----- BEGIN CERTIFICATE -----" y "----- END CERTIFICATE -----"

Estas líneas faltantes son opcionales. CA puede generarlos o no dependiendo de la configuración. Por todas las razones prácticas, se pueden eliminar del archivo codificado en Base64.

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

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));

Intenté quitar el ''X509KeyStorageFlags.Exportable "pero eso no funciona. ¿Me estoy perdiendo algo?

Editar - lo intenté

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

y eso parece funcionar, sin embargo, falta el "----- BEGIN CERTIFICATE -----" y "----- END CERTIFICATE -----"


Para aquellos que implementan algo similar en .NET Core, aquí está el código, basado en lo que hizo Tyranid. Base64FormattingOptions.InsertLineBreaks no existe en .NET Core, por lo que tuve que implementar mi propia forma de romper líneas.

// 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(); }


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(); }


prueba esto:

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