c# - MakeCert 和 OpenSSL wrt C# SslStream 之间的区别

标签 c# ssl openssl makecert

我正在尝试使用 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/

相关文章:

c# - 带有 Prism 的 MVVM 编码是否与 MVVM 本身不同?

c# - MongoDB 客户端在 mscorlib 中引发 FileNotFoundException

c# - 如何以编程方式从浏览器中删除已保存的密码

apache - 使用 https 将 Apache 配置为 Tomcat 的反向代理

security - SSL:如何平衡 API 性能与安全性?

python - 使用 PKCS#8 编码的私钥创建兼容的 Java "RSA"签名

c# - 检查文本框是否为空

由于 "<urlopen error unknown url type: https>",Python HTTPS 下载失败

c - 如何使用 OpenSSL 计算 SHA512/224 和 SHA512/256 哈希值?

node.js - Nodemailer 不适用于 Aruba Webmail