MakeCert和OpenSSL之间的区别是C#SslStream

时间:2014-10-03 21:02:55

标签: c# ssl openssl makecert

我正在尝试使用OpenSSL生成的证书在C#中使用TLS加密创建TCP连接。

给定here的SslStream示例代码似乎使用使用windows makecert.exe创建的证书,该证书作为.cer文件出现。它不适用于通过OpenSSL创建的证书,这是一个.pem文件,引发了激活:"服务器模式SSL必须使用带有相关私钥的证书。"

两个证书文件都被成功解析为X509Certificate对象,因为我可以看到他们的发行人和主题以及其他属性,并注意" HasPrivateKey"属性是假的#34; PrivateKey"属性为

我发现this表示您需要将(OpenSSL)证书和私钥合并到一个PKCS12包中。然而,PKCS12包是文件格式.pfx - 为什么OpenSSL证书必须与私钥组合到pfx中,但是makecert生成的.cer文件不需要是pfx(并且不是PKCS12) ?

另外,当MakeCert证书也没有私钥时,OpenSSL证书首先会有什么不同之处让它抛出关于丢失私钥的这个例外?换句话说,为什么MakeCert证书似乎不需要私钥,比如OpenSSL证书?

1 个答案:

答案 0 :(得分:1)

IRC上有人告诉我,makecert可能会在Windows证书库中放置凭据。我没想到会出现这种情况,因为我们正在导出文件,但我将我的SslStream原型(带有makecert证书)移动到另一台机器(即不是运行makecert的机器),我得到了同样的错误& #34;服务器模式SSL必须使用带有相关私钥的证书。"

正式如此,答案是" makecert将密钥放入您的证书存储区,当您运行AuthenticateAsClient时,它会在后台将私钥拉出来。这就是为什么makecert证书有效并且OpenSSL证书不起作用的原因,即使它们几乎完全相同。

更进一步,为了让事情与OpenSSL证书一起使用,我确定我在关于将公钥和私钥组合到PKCS12(.pfx)文件中的问题中的建议可行,但是我想在飞行中加载/组合它们。我发现this codeproject article包含示例代码,该代码执行解码RSA私钥的所有脏工作,使其成为RSACryptoProvider,并将该对象附加到X509Certificate2.PrivateKey属性。执行此操作并提供OpenSSL生成的单独证书和私钥文件的路径后,一切都很好!