4

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

此处给出的 SslStream 示例代码似乎可以使用使用 windows makecert.exe 创建的证书工作,该证书以 .cer 文件的形式出现。它不适用于通过 OpenSSL 创建的证书,这是一个 .pem 文件,抛出异常:“服务器模式 SSL 必须使用具有关联私钥的证书。”

两个证书文件都被成功解析为 X509Certificate 对象,因为我可以看到它们的颁发者和主题以及其他属性,并注意“HasPrivateKey”属性为假“PrivateKey”属性在它们两者上都为空。

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

此外,当 MakeCert 证书也没有私钥时,OpenSSL 证书首先有什么不同,导致它抛出关于丢失私钥的异常?或者换句话说,为什么 MakeCert 证书似乎不需要像 OpenSSL 证书那样的私钥?

4

1 回答 1

1

IRC 上的某个人向我建议,可能是 makecert 将凭据放入 Windows 证书存储区。我没想到会出现这种情况,因为我们正在导出文件,但是我将我的 SslStream 原型(带有 makecert 证书)移动到另一台机器(即不是运行 makecert 的机器)并且我得到了同样的错误“服务器模式 SSL 必须使用具有关联私钥的证书。”

因此,官方的答案是“makecert 将密钥放入您的证书存储区,当您运行 AuthenticateAsClient 时,它会在后台将私钥从那里拉出。这就是 makecert 证书有效而 OpenSSL 证书无效的原因,即使它们几乎相同。

更进一步,为了使用 OpenSSL 证书,我确信我在问题中链接的关于将公钥和私钥组合到 PKCS12 (.pfx) 文件中的建议会起作用,但是我想加载/即时组合它们。我找到了这篇 codeproject 文章,其中包含示例代码,这些代码完成了解码 RSA 私钥、使其成为 RSACryptoProvider 并将该对象附加到 X509Certificate2.PrivateKey 属性的所有脏活。完成此操作并提供 OpenSSL 生成的单独证书和私钥文件的路径后,一切正常!

于 2014-10-08T15:52:27.373 回答