【问题标题】:Add Private Key to X509Certificate将私钥添加到 X509Certificate
【发布时间】:2023-03-19 18:18:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: c# .net ssl x509certificate


【解决方案1】:

我创建了一个小型帮助程序 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);

有关基于opensslkey 的功能和代码示例,请参阅NuGetGithub-project

【讨论】:

  • 耶啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!终于有人做了这个!
  • 讨厌删除这个,但是使用上面的 sn-p 会生成一个没有私钥的证书。有什么想法吗?
【解决方案2】:

我猜你可能在这里遗漏了一些概念性的想法?

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

【讨论】:

  • 嗯,没错,这是有道理的。但是我仍然想知道两件事:1.为什么在OpenSSL中可以将私钥添加到证书中? 2. 如果证书不应该有私钥,这个异常是什么意思?由“AuthenticateAsServer()”抛出:System.NotSupportedException:服务器模式 SSL 必须使用具有关联私钥的证书
  • 不可能。也许他们的术语很草率,但可以创建一个包含私钥和证书的文件。我看不出关于“带有相关私钥的证书 有什么难理解的地方。它没有说明钥匙在里面。
  • 好的,那么您能否给我一些建议,告诉我如何将私钥与 .net 中的证书关联起来?我有一个使用 OpenSSL 创建并存储在光盘上的 .key 文件中的私钥。在 OpenSSL 中,可以简单地调用 cert.PrivateKey = Key,但由于没有 .net 包装器的文档,我不知道它的作用。显然没有将其添加到证书中。
  • X509Certificate2 可以包含私钥。 msdn.microsoft.com/en-us/library/…
  • 证书本身,就证书所在的系统而言,确实拥有私钥。他们需要知道私钥,因为您将如何解密使用证书代表的公钥加密发送的任何消息?它们也存储在生成它们的系统上。这不是对所提出问题的回答,但应该是评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多