C# 如何将SSL证书从PEM转换为DER并保留私钥?

C# 如何将SSL证书从PEM转换为DER并保留私钥?,c#,.net,ssl,certificate,x509,C#,.net,Ssl,Certificate,X509,背景故事:我有一个PKCS#12(p12)证书,带有对称密码(密码),我使用OpenSSL将其转换为PEM;以文本形式打开它,它既包含开始/结束证书部分,也包含开始/结束RSA私钥。NET FrameworkX509Certificate类只支持“ASN.1 DER”格式,因此我使用OpenSSL将PEM转换为DER。不幸的是,这样做似乎不包括私钥,而私钥正是我与SslStream和TcpClient建立SSL连接所需要的 X509CertificateCollection certsFromF

背景故事:我有一个PKCS#12(p12)证书,带有对称密码(密码),我使用OpenSSL将其转换为PEM;以文本形式打开它,它既包含
开始/结束证书
部分,也包含
开始/结束RSA私钥
。NET Framework
X509Certificate
类只支持“ASN.1 DER”格式,因此我使用OpenSSL将PEM转换为DER。不幸的是,这样做似乎不包括私钥,而私钥正是我与
SslStream
TcpClient
建立SSL连接所需要的

X509CertificateCollection certsFromFile = new X509CertificateCollection();
X509Certificate2 cert = new X509Certificate2("my.der.crt");
if (!cert.HasPrivateKey)
    throw new Exception("No private key");
certsFromFile.Add(cert);

TcpClient tcpclient = new TcpClient(hostname, port);
SslStream sslstream = new SslStream(tcpclient.GetStream(), false,
    null, null);
sslstream.AuthenticateAsClient(hostname, certsFromFile,
    SslProtocols.Ssl3, false);
sslstream.Close();
tcpclient.Close();

如何在保留私钥信息的同时将此PEM文件保存到DER中,以便在.NET中使用它进行签名?

证书和密钥通常单独存储。将PEM文件剪切为两个文件,一个带有证书,另一个带有密钥。然后,您可以使用openssl工具包将每个文件分别转换为DER文件。

哎呀,我落后于时代了!看起来
X509Certificate2
可以读取PKCS#12文件,因此无需进行任何转换