2013-08-26 197 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