将私钥添加到X509Certificate

Pog*_*ips 4 .net c# ssl x509certificate

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

myCert.PrivateKey = CryptoKey.FromPrivateKey(rsa.PrivateKeyAsPEM, null);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ste*_*ath 8

我创建了一个小帮手NuGet包来创建一个基于X509证书公钥私(RSA)键.

// 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);
Run Code Online (Sandbox Code Playgroud)

有关基于opensslkey的功能和代码示例,请参阅NuGetGithub项目.

  • 讨厌破坏这个,但是使用上面的代码片段会生成一个没有私钥的证书。有任何想法吗? (2认同)

Lon*_*per 2

我想您可能在这里缺少一些概念性想法?

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

  • X509Certificate2 可以包含私钥。https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.privatekey%28v=vs.110%29.aspx (4认同)
  • 就证书所在的系统而言,证书本身<i>确实</i>拥有私钥。他们需要知道私钥,因为如何解密使用证书代表的公钥加密发送的任何消息?它们也存储在生成它们的系统上。这不是对所提出问题的答案,而是应该作为评论。 (4认同)
  • 嗯,确实,这是有道理的。但我仍然想知道两件事: 1.为什么在OpenSSL中可以将私钥添加到证书中?2. 如果证书不应该有私钥,那么这个异常是什么意思?由“AuthenticateAsServer()”抛出:System.NotSupportedException:服务器模式 SSL 必须使用具有关联私钥的证书 (2认同)