2014-10-03 29 views
2

我正在嘗試在C#中使用OpenSSL生成的證書在TLS加密上創建TCP連接。MakeCert和OpenSSL之間的區別關於C#SslStream

給出here的SslStream示例代碼似乎可以使用Windows makecert.exe創建的證書工作,該證書以.cer文件形式出現。它不適用於通過OpenSSL創建的證書,該證書是一個.pem文件,引發了一些注意:「服務器模式SSL必須使用帶有關聯私鑰的證書。」

兩個證書文件被成功解析爲x509證書的對象,因爲我可以看到他們的發行方和主題等性能,並注意「HasPrivateKey」屬性設置爲false「專用密鑰」屬性爲他們兩人的。

我發現this其中說你需要將(OpenSSL)證書和私鑰組合成一個PKCS12包。然而,PKCS12包是文件格式.pfx - 爲什麼OpenSSL證書必須與私鑰組合成pfx,但makecert生成的.cer文件不需要是pfx(而不是PKCS12) ?

此外,當MakeCert證書還沒有私鑰時,首先使OpenSSL證書有所不同,從而導致丟失該私鑰的異常?或者換句話說,爲什麼MakeCert證書似乎不需要私鑰,比如OpenSSL證書?

回答

1

IRC上有人向我建議,可能是makecert將證書放在Windows證書存儲區中。我沒有想到會出現這種情況,因爲我們正在導出文件,但是我將SslStream原型(使用makecert證書)移到了另一臺機器上(即沒有運行makecert的機器),並且我得到了同樣的錯誤「服務器模式SSL必須使用帶有關聯私鑰的證書。「

所以正式的答案是「makecert把密鑰放到你的證書存儲區,當你運行AuthenticateAsClient時,它會在後臺拉出私鑰,這就是爲什麼makecert證書可以工作,而OpenSSL證書雖然它們幾乎完全相同,但它並不是,即使它們幾乎完全相同,但我相信我在關於將公鑰和私鑰組合成一個問題時所引用的建議我發現this codeproject article包含示例代碼,它可以完成解碼RSA私鑰的所有骯髒工作,並將其轉換爲RSACryptoProvider,並將其附加到RSACryptoProvider中該對象爲X509Certificate2。 PrivateKey屬性。完成此步驟並提供由OpenSSL生成的單獨證書和私鑰文件的路徑後,一切都很順利!

+0

更新:當前代碼項目文章中的代碼不支持舊的過時Windows Server 2003.請記住,如果它影響到您。 – user1169420 2015-06-02 17:50:48