我正在尝试使用 OpenSSL 生成的证书在 C# 中创建基于 TLS 加密的 TCP 连接。
给出的 SslStream 示例代码 here似乎使用由 windows makecert.exe 创建的证书工作,该证书作为 .cer 文件出现。它不适用于通过 OpenSSL 创建的证书,这是一个 .pem 文件,抛出异常:“服务器模式 SSL 必须使用具有关联私钥的证书。”
两个证书文件都被成功解析为 X509Certificate 对象,因为我可以看到它们的颁发者和主题以及其他属性,并注意“HasPrivateKey”属性为 false “PrivateKey”属性为 null 在它们上强>.
我找到了 this其中表示您需要将 (OpenSSL) 证书和私钥组合到一个 PKCS12 包中。然而 PKCS12 包的文件格式是 .pfx——为什么 OpenSSL 证书必须与私钥组合成 pfx,而 makecert 生成的 .cer 文件不需要是 pfx(并且不是 PKCS12) ?
此外,当 MakeCert 证书也没有私钥时,OpenSSL 证书首先会抛出有关丢失私钥的异常的区别是什么?或者换句话说,为什么 MakeCert 证书不像 OpenSSL 证书那样需要私钥?
最佳答案
IRC 上的某人向我建议,可能是 makecert 将凭据放入 Windows 证书存储区。我没想到会是这种情况,因为我们正在导出文件,但是我将我的 SslStream 原型(prototype)(带有 makecert 证书)移动到另一台机器(即不是运行 makecert 的机器)并且我得到了同样的错误“服务器模式 SSL 必须使用具有关联私钥的证书。”
所以官方的答案是“makecert 将 key 放入您的证书存储区,当您运行 AuthenticateAsClient 时,它会在后台从那里提取私钥。这就是为什么 makecert 证书有效而 OpenSSL 证书无效的原因',即使它们几乎相同。
更进一步,为了让事情与 OpenSSL 证书一起工作,我确信我在关于将公钥和私钥组合到 PKCS12 (.pfx) 文件的问题中链接的建议会奏效,但是我想即时加载/组合它们。我找到了 this codeproject article其中包含示例代码,这些代码完成解码 RSA 私钥的所有脏工作,使其成为 RSACryptoProvider,并将该对象附加到 X509Certificate2.PrivateKey 属性。执行此操作并提供由 OpenSSL 生成的单独证书和私钥文件的路径后,一切正常!
关于c# - MakeCert 和 OpenSSL wrt C# SslStream 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26186780/