将私钥添加到X509Certificate

时间:2013-08-26 14:07:37

标签: c# .net ssl x509certificate

我正在研究一些当前使用OpenSSL.net为证书签名请求创建公钥/私钥对的代码。该请求配有公钥并发送给CA,CA返回签名证书。然后将先前创建的私钥添加到证书中:

myCert.PrivateKey = CryptoKey.FromPrivateKey(rsa.PrivateKeyAsPEM, null);

问题是我需要.net X509Certificate,因为其余的软件使用SslStream和其他.net类进行TLS。

我能够从CA的响应中创建证书,但我没有找到向其添加私钥的方法。我还尝试从CA的响应创建一个OpenSSL证书,将其导出为DER或PEM并从中创建.net证书,但它始终忽略私钥。

关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:7)

我已经创建了一个小帮手NuGet包,用于在公钥私钥(rsa)密钥上创建 X509证书

// Generate with: openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout private.key -out certificate_pub.crt
string certificateText = File.ReadAllText("certificate_pub.crt");
string privateKeyText = File.ReadAllText("private.key");

ICertificateProvider provider = new CertificateFromFileProvider(certificateText, privateKeyText);
X509Certificate2 certificate = provider.Certificate;

// Example: use the PrivateKey from the certificate above for signing a JWT token using Jose.Jwt:
string token = Jose.JWT.Encode(payload, certificate.PrivateKey, JwsAlgorithm.RS256);

请参阅NuGetGithub-project了解基于opensslkey的功能和代码示例。

答案 1 :(得分:2)

我想也许你在这里错过了一些概念性的想法?

证书不应包含私钥。私钥始终是私有的,证书是将您的公钥绑定到您的专有名称的证书。换句话说,证书是由权威机构签署的文件,该机构确认您与世界共享的特定公钥属于您而不属于您。因此,它永远不会包含私钥,因为您与世界共享您的证书!