如何在C#中将xml格式的密钥对更改为PEM格式?

时间:2011-08-09 11:29:06

标签: c# xml certificate pem

我尝试将创建的密钥对以xml格式更改为PEM格式。 这是我的代码。

CspParameters cspParams = new CspParameters();
cspParams.ProviderType = 1;  
cspParams.Flags = CspProviderFlags.UseArchivableKey;
cspParams.KeyNumber = (int)KeyNumber.Exchange;
rsaProvider = new RSACryptoServiceProvider(1024,cspParams);
RSAParameters rsa_params = rsaProvider.ExportParameters(true);
byte[] rsa_export = rsaProvider.ExportCspBlob(true); 

//here I've try to get private key data
string data__ = Convert.ToBase64String(rsa_export);  
FileStream fs = new FileStream(privateKeyFileName, FileMode.CreateNew);

string type = "RSA PRIVATE KEY";
string header = String.Format("-----BEGIN {0}-----\n", type);
string footer = String.Format("\n-----END {0}-----", type);

data__  = header+data__+footer;
byte[] d_ = Encoding.Default.GetBytes(data__); 

//write to file        
fs.Write(d_, 0, d_.Length);
fs.Close();

运行之后我有一个私钥,但是当我使用密钥测试时使用命令创建证书:

openssl req -new -x509 -key privatekey.pvk -config       
"C:\AppServ\php5\extras\openssl\openssl.cnf" -out myCert.cer -days 365

发生错误

unable to load Private Key
3004:error:0906D064:PEM routines:PEM_read_bio:bad base64 decode:.\crypto\pem\pem_lib.c:756:

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

请记住,openssl对于PEM证书格式化很挑剔。

  1. 该文件必须包含: -----BEGIN CERTIFICATE----- 在另一条线上(即必须用换行符终止)。
  2. " gibberish"必须是64个字符宽。
  3. 文件必须以: -----END CERTIFICATE----- 并且还会以换行符结束。
  4. 不要使用Word保存证书文本。它必须是ASCII。
  5. 不要混合DOS和UNIX样式的行终止。
  6. 所以在你的情况下,看起来你并没有包裹" gibberish" 64个字符,END标记缺少换行符。

    对于没有编写自己的密钥对的其他人,可以采取以下几个步骤来规范化Linux上的证书文件:

    1. 通过dos2unix:# dos2unix cert.pem
    2. 运行它
    3. 通过fold:# fold -w 64 cert.pem
    4. 运行它

      如果您使用的是Windows,请尝试下载Cygwin,然后您就可以获得这些转换工具。