2011-01-19 9 views
21

Sto tentando di esportare un certificato senza la chiave privata come file codificato BASE-64, come se lo stessi esportando da Windows. Quando esportato da Windows sono in grado di aprire il file .cer nel blocco note.Esportazione di un certificato come codificato BASE-64 .cer

Quando provo quanto segue e apro sul blocco note ottengo dati binari ... Penso che sia ... non leggibile. .

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

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

Ho provato a rimuovere il 'X509KeyStorageFlags.Exportable", ma questo non funziona mi sto perdendo qualcosa

Edit -? Ho provato

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

e che sembra funzionare, però , manca il "----- BEGIN CERTIFICATE -----" e "----- END CERTIFICATE -----"

+0

Grazie alla struttura mono obsoleti sono costretto ad utilizzare, ho fatto ricorso a chiamare OpenSSL come un processo esterno: 'openssl pkcs12 -in ImportPath -nokeys -passin passare:' - questo funziona su Linux e Windows openssl binari. – Rbjz

risposta

45

Forse

/// <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

Questo metodo può anche essere offerto come metodo di estensione inserendolo in una classe statica e cambiando la sua firma in: 'stringa statica pubblica ExportToPEM (questo certificato X509Certificate)' –

2

provare questo:

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

// tuttavia, manca il "----- BEGIN CERTIFICATE -----" e "----- END CERTIFICATE -----"

Queste linee mancanti sono opzionali. CA può generarli o meno a seconda delle impostazioni. Per tutti i motivi pratici possono essere rimossi dal file codificato Base64.

1

Per coloro che implementano qualcosa di simile in .NET Core, ecco il codice, basato su ciò che ha fatto il tirannide. Base64FormattingOptions.InsertLineBreaks non esiste in .NET Core, quindi ho dovuto implementare il mio modo di fare il line break.

// 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

Grazie !!! Ha funzionato :) –