2016-10-24 75 views
0

我需要在.crl擴展名中轉換一堆證書吊銷列表,它們是DER格式(二進制),我需要將它們轉換爲PEM格式(Base64字符串表示形式每個.crl文件的二進制內容)。在.net中轉換不同的證書吊銷列表格式

按照指示在Convert .der to .pem using OpenSSL-Net,我創建了下面的代碼試圖單一的.crl文件從DER格式爲PEM格式轉換:

private static void generateCrl() 
    { 
     byte [] certbyte = File.ReadAllBytes("D:\\certsunzip\\DODIDCA_44.crl"); 
     Console.WriteLine("First byte: {0}", certbyte[0]); 
     X509Certificate2 cert = new X509Certificate2(certbyte); 
     string pem = "-----BEGIN X509 CRL-----\r\n" + Convert.ToBase64String(cert.RawData, Base64FormattingOptions.InsertLineBreaks) + "-----END X509 CRL-----"; 
     using (StreamWriter outputFile = new StreamWriter(@"D:\certsunzip\test.crl")) 
     { 
      foreach (char chr in pem) 
      outputFile.WriteLine(chr); 
     } 
    } 

然而,當我運行的代碼中,X509Certificate2構造拋出一個CryptographicException說「無法找到請求的對象」。我想知道是否有另一種方法可以進行此轉換,也許X509Certificate2構造函數不喜歡crl文件?

回答

2

刪除第3行,因爲它沒有任何意義(因爲X509Certificate2類不支持的CRL),並使用在4號線「certbyte」變量:

private static void generateCrl() 
{ 
    byte [] certbyte = File.ReadAllBytes("D:\\certsunzip\\DODIDCA_44.crl"); 
    Console.WriteLine("First byte: {0}", certbyte[0]); 
    string pem = "-----BEGIN X509 CRL-----\r\n" + Convert.ToBase64String(certbyte, Base64FormattingOptions.InsertLineBreaks) + "-----END X509 CRL-----"; 
    using (StreamWriter outputFile = new StreamWriter(@"D:\certsunzip\test.crl")) 
    { 
     outputFile.Write(pem); 
    } 
} 

這將工作。

+0

這會給每一個字符換一行。跳過'使用(StreamWriter outputFile ....'並且使用'File.WriteAllText(@「D:\ certsunzip \ test.crl」,pem);' – pepo

+0

另外'Base64FormattingOptions.InsertLineBreaks'將在每76個字符之後添加換行符。打電話給我老學校,但我習慣在PEM編碼的文件中每行看到64個字符,但是我用openssl.exe檢查了輸出,並且它正確地解析了它,所以我想它很好。 – pepo

+0

換行符真的不相關。即使把每個字符放在自己的行上,正確的解析器也必須正確處理這個 – Crypt32