Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MakeCert和OpenSSL wrt C#SslStream之间的区别_C#_Ssl_Openssl_Makecert - Fatal编程技术网

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

MakeCert和OpenSSL wrt C#SslStream之间的区别,c#,ssl,openssl,makecert,C#,Ssl,Openssl,Makecert,我正在尝试使用OpenSSL生成的证书在C#中的TLS加密上创建TCP连接 给出的SslStream示例代码似乎使用windows makecert.exe创建的证书工作,该证书以.cer文件的形式出现。它不适用于通过OpenSSL创建的证书,OpenSSL是一个.pem文件,抛出了一个例外:“服务器模式SSL必须使用带有相关私钥的证书。” 这两个证书文件都被成功解析为X509Certificate对象,因为我可以看到它们的颁发者和主题以及其他属性,请注意,“HasPrivateKey”属性为f

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

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

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

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


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

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

因此,官方的答案是“makecert将密钥放入您的证书存储中,当您运行AuthenticateTasClient时,它会在后台将私钥取出。这就是为什么makecert证书有效而OpenSSL证书无效,尽管它们几乎相同


更进一步,为了使OpenSSL证书能够正常工作,我确信我在问题中所链接的关于将公钥和私钥组合到PKCS12(.pfx)中的建议文件本来可以工作,但我想动态加载/组合它们。我发现其中包含的示例代码完成了所有脏活,包括解码RSA私钥、将其转换为RSACryptoProvider并将该对象附加到X509Certificate2.PrivateKey属性。完成此操作并提供到单独的证书和私钥的路径ate由OpenSSL生成的密钥文件,一切都很好!

更新:当前该codeproject文章中的代码不支持旧的过时的Windows Server 2003。如果它影响您,请记住这一点。