如何将 PEM 编码的 X509 证书
转换为充气城堡 X509 证书?我收到代表签名证书颁发者的 PEM 编码的 X509 证书(在 RFC 5280 中定义)。PEM 编码格式(在 RFC 1421 中定义)要求行长度为 64 个字符。PEM 编码证书通过 HttpWebRequest (application/json;charset=utf-8) 接收。
这是大多数时候有效的方法:
Org.BouncyCastle.X509.X509Certificate pemToX509Certificate(string signature)
{
byte[] buffer = GetBytesFromPEM("CERTIFICATE", signature);
X509CertificateParser parser = new X509CertificateParser();
Org.BouncyCastle.X509.X509Certificate cert = parser.ReadCertificate(buffer);
return cert;
}
byte[] GetBytesFromPEM(string type, string pem)
{
byte[] bytes = Encoding.Default.GetBytes(pem);
pem = Encoding.UTF8.GetString(bytes);
string header = String.Format("-----BEGIN {0}-----", type);
string footer = String.Format("-----END {0}-----", type);
int start = pem.IndexOf(header) + header.Length;
int end = pem.IndexOf(footer, start);
string base64 = pem.Substring(start, (end - start));
return Convert.FromBase64String(base64);
}
这是正确的方法吗?尤其是Encoding.UTF8.GetString部分?因为我已经特别告诉 HttpWebRequest 响应是 StreamReader(response) 中的 UTF8。GetResponseStream(), Encoding.UTF8).
看到评论,我删除了前两行:
protected static byte[] GetBytesFromPEM(string type, string pem)
{
string header = String.Format("-----BEGIN {0}-----", type);
string footer = String.Format("-----END {0}-----", type);
int start = pem.IndexOf(header) + header.Length;
int end = pem.IndexOf(footer, start);
string base64 = pem.Substring(start, (end - start));
return Convert.FromBase64String(base64);
}