MakeCert和OpenSSL之间的差异写入C#SslStream
本文关键字:C#SslStream OpenSSL 之间 MakeCert | 更新日期: 2023-09-27 18:25:33
我正试图使用OpenSSL生成的证书在C#中创建TLS加密的TCP连接。
这里给出的SslStream示例代码似乎使用windows makecert.exe创建的cert来工作,该cert以.cer文件的形式出现。它不适用于通过OpenSSL创建的证书,OpenSSL是一个.pem文件,抛出excpetion:"服务器模式SSL必须使用带有相关私钥的证书。"
两个证书文件都被成功解析为X509Certificate对象,因为我可以看到它们的颁发者和主题以及其他属性,并注意到"HasPrivateKey"属性是false,"PrivateKey"属性在它们两个上都是null。
我发现这说明您需要将(OpenSSL)证书和私钥组合到一个PKCS12包中。然而,PKCS12包的文件格式是.pfx——为什么OpenSSL证书必须与私钥组合成pfx,而makecert生成的.cer文件不需要是pfx(而且不是PKCS12)?
此外,当MakeCert证书也没有私钥时,OpenSSL证书首先会抛出关于丢失私钥的异常,这与它有什么不同?或者换句话说,为什么MakeCert证书似乎不需要像OpenSSL证书那样的私钥?
IRC上有人向我建议,可能是makecert正在将凭据放入windows证书存储中。我没想到会是这样,因为我们正在导出文件,但我把我的SslStream原型(带有makecert证书)移到了另一台机器(即不是运行makecert的机器),我得到了同样的错误"服务器模式SSL必须使用带有相关私钥的证书。"
因此,官方的答案是"makecert将密钥放入你的证书存储中,当你运行AuthenticateAsClient时,它会在后台提取私钥。这就是为什么makecert证书有效,而OpenSSL证书无效,尽管它们几乎相同。
更进一步,为了让OpenSSL证书发挥作用,我相信我在问题中链接的关于将公钥和私钥组合到PKCS12(.pfx)文件中的建议会起作用,但我想动态加载/组合它们。我发现了这篇代码项目文章,其中包含一些示例代码,这些代码完成了对RSA私钥进行解码、将其制作成RSACryptoProvider并将该对象附加到X509Certificate2.PrivateKey属性的所有肮脏工作。完成这项工作并提供OpenSSL生成的单独证书和私钥文件的路径后,一切都很好!