2013-08-26 80 views
2

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

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

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

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

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

+0

这是否得到解决?我有同样的问题。 –

+2

是的,我做了:http://stackoverflow.com/questions/18462064/associate-a-private-key-with-the-x509certificate2-class-in-net – PogoMips

+0

不错。在发布之后,我终于弄清楚了。我的方法是多一点手动。但在这里。 http://stackoverflow.com/questions/243646/how-to-read-a-pem-rsa-private-key-from-net/19579157#19579157 –

回答

0

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

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

+0

嗯,真的,这是有道理的。但是我仍然想知道两件事情:1.为什么在OpenSSL中可以将私钥添加到证书中? 2.如果证书不应该有私钥,这个例外是什么意思?由“AuthenticateAsServer()”抛出:System.NotSupportedException:服务器模式SSL必须使用带有关联私钥的证书 – PogoMips

+0

这是不可能的。也许他们的术语sl,不驯,但有可能创建一个包含私钥和证书的*文件*。我没有看到任何难以理解的'具有相关私钥的证书*'。它没有说任何关于里面的关键。 – EJP

+0

好的,那么你可以给我一些建议,关于如何将私钥与.net中的证书相关联?我有一个使用OpenSSL创建并存储在光盘上的.key文件中的私钥。在OpenSSL中,可以简单地调用cert.PrivateKey = Key,但由于没有关于.net包装的文档,我不知道它的作用。显然不会将其添加到证书中。 – PogoMips

2

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