向X509证书添加私钥

8

我正在处理一些使用OpenSSL.net创建证书签名请求的代码。该请求使用公钥并发送给CA以获得签名证书。之后,先前创建的私钥将被添加到证书中:

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

问题在于我需要一个 .net X509Certificate,因为软件的其余部分使用 SslStream 和其他 .net 类库实现 TLS。
我能够从 CA 的响应中创建证书,但我没有找到一种方法将私钥添加到其中。我还尝试从 CA 的响应中创建 OpenSSL 证书,将其导出为 DER 或 PEM,并从中创建 .net 证书,但它总是忽略私钥。
您有什么解决这个问题的想法吗?

这个问题解决了吗?我也遇到了同样的问题。 - The Lazy Coder
2
是的,我做了:https://dev59.com/HGMl5IYBdhLWcg3wXWAT - PogoMips
很好。在这里发布后,我最终能够弄清楚。我的方法有点手动。但是这就是它的链接:https://dev59.com/3renzYgBFxS5KdRjENbW#19579157 - The Lazy Coder
2个回答

15

我创建了一个小型的辅助 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项目,了解基于opensslkey的功能和代码示例。


耶!!!终于有人做了这个!! - Gaspa79
2
很抱歉打扰,但是使用您上面的代码片段生成的证书没有私钥。有什么建议吗? - Matthew Heimlich

2

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

证书不应该包含私钥。私钥始终是私有的,证书是将您的公钥绑定到您的可分辨名称的东西。换句话说,证书是由授权机构签署的文件,确认您与全世界共享的特定公钥属于您自己,而不是其他任何人。因此,它永远不会包含私钥,因为您将您的证书与全世界共享!


2
嗯,确实,这很有道理。但我仍然想知道两件事:1. 为什么在OpenSSL中可以将私钥添加到证书中?2. 如果证书不应该有私钥,那么“AuthenticateAsServer()”抛出的异常是什么意思?System.NotSupportedException: 服务器模式SSL必须使用带有关联私钥的证书。 - PogoMips
不可能的。也许他们的术语不够准确,但是可以创建一个包含私钥和证书的文件是可能的。我不认为“带有相关私钥的证书”有什么难以理解的地方。它并没有说密钥在内部。 - user207421
好的,那么你能否给我一些建议,告诉我如何在 .net 中将私钥与证书关联起来呢?我有一个使用 OpenSSL 创建并存储在磁盘上的 .key 文件。在 OpenSSL 中,可以简单地调用 cert.PrivateKey = Key,但由于没有 .net 封装的文档,我不知道它是什么意思。显然,它没有将其添加到证书中。 - PogoMips
嗯,我从未使用过openssl的.net封装器,但我猜想你得到的异常可能是因为你在ssl连接中使用了错误的私钥。你知道你应该使用最初生成的相同的私钥和公钥对。你不能使用任何私钥与为某个公钥颁发的证书一起使用。 - LonelyDeveloper
4
X509Certificate2 可以包含私钥。 https://msdn.microsoft.com/zh-cn/library/system.security.cryptography.x509certificates.x509certificate2.privatekey(v=vs.110).aspx - Oran Dennison
4
证书本身在其所存在的系统中确实有私钥。它们需要知道私钥,因为如果使用证书表示的公钥加密发送任何消息,那么如何解密呢?证书也存储在生成它们的系统上。这不是对所提出问题的答案,应该是一条评论。 - Richard Barker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接