将私钥添加到X509Certificate

本文关键字:X509Certificate 添加 私钥 | 更新日期: 2023-09-27 18:29:00

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

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

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

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

关于我该如何解决这个问题,有什么想法吗?

将私钥添加到X509Certificate

我创建了一个小助手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);

有关基于openssley的功能和代码示例,请参阅NuGet和Github项目。

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

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