2011-01-19 20 views
21

我想導出一個沒有私鑰的證書作爲BASE-64編碼文件,與從窗口導出它一樣。從Windows導出時,我可以在記事本中打開.cer文件。導出證書作爲BASE-64編碼.cer

當我嘗試以下操作並打開記事本時,我得到二進制數據......我認爲這是...不可讀。 。

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

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

我試圖消除「X509KeyStorageFlags.Exportable」,但不工作我缺少的東西

編輯 - 我試圖

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

這似乎工作,但是,缺少「----- BEGIN CERTIFICATE -----」和「----- END CERTIFICATE -----」

+0

由於過時的單框架我一定要使用,我使出調用OpenSSL的作爲外部進程:`OpenSSL的PKCS12 -in importPath -nokeys -passin傳:` - 這適用於Linux和Windows的OpenSSL二進制文件。 – Rbjz 2016-07-22 13:10:07

回答

45

也許

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

此方法也可作爲擴展方法提供,將其置於靜態類中,並將其簽名更改爲: `public static string ExportToPEM(this X509Certificate cert)` – 2015-09-21 07:12:05

2

試試這個:

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

//然而,缺少 「----- BEGIN CERTIFICATE -----」 和 「----- END CERTIFICATE -----」

這些缺失的行是可選的。 CA可能會根據設置生成它們或不生成它們。出於所有實際的原因,他們可以從Base64編碼文件中刪除。

1

對於那些在.NET Core中實現類似的東西,這裏是代碼,基於tyranid做了什麼。 Base64FormattingOptions.InsertLineBreaks在.NET Core中不存在,所以我必須實現我自己的方式來進行換行。

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

Thanks !!!這工作:) – 2017-11-17 12:00:47