2016-10-24 39 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