gpt4 book ai didi

c# - SslStream 客户端无法完成与 Stunnel 服务器的握手

转载 作者:太空狗 更新时间:2023-10-29 23:25:00 26 4
gpt4 key购买 nike

我有一个完全可操作的系统,其中基于 openssl 的客户端与 openssl 服务器交互。每个客户端都有自己的证书,由服务器验证。已使用 openssl(X509、pem)生成证书。它们是自签名的。

我现在想写一个基于SslStream的测试客户端。我使用了 SslStream 类中的客户端示例 documentation .

我的 SslStream 客户端无法完成握手。 stunnel 提示客户端未发送其证书。这在 Wireshark 中得到确认(证书长度:握手消息中的 0)。

我的客户端显示以下异常:

Inner exception: The message received was unexpected or badly formatted

这是我加载证书的方式:

X509Certificate cert = new X509Certificate2(filename, password);
X509CertificateCollection certColl = new X509CertificateCollection();
certColl.Add(cert);

我尝试检索证书的各种属性(例如:GetSerialNumberString())。有用。 Verify 方法返回 false。这是我接下来要调查的事情。

我如何设置我的 SslStream 似乎并不重要(相同的结果):

sslStream.AuthenticateAsClient(serverName);

SslStream sslStream = new SslStream(
client.GetStream(),
false,
new RemoteCertificateValidationCallback(ValidateServerCertificate),
new LocalCertificateSelectionCallback(SelectLocalCertificate));

与身份验证相同:

sslStream.AuthenticateAsClient(serverName);

sslStream.AuthenticateAsClient(serverName,
certColl,
SslProtocols.Tls,
true);

SelectLocalCertificate 被调用(两次)并返回我的证书。 ValidateServerCertificate 目前从未被调用(令我惊讶的是)。

我该如何调试它?如果你能解决我的问题就更好了。

更新

我添加了一个函数来执行基于 X509Chain example 的链验证从文档中。它显示有关证书的各种信息,包括两条有趣的消息:

Element certificate is valid: False
Element error status length: 1

最后,我真的没有比调用验证时更多的详细信息。

openssl verify cert.pem 的输出没有报告任何异常情况。

error 18 at 0 depth lookup:self signed certificate
OK

更新

我从 pem 中提取了私钥和证书,并生成了一个 cert.pfx (pkcs12)。我在我的个人 keystore 中导入 cert.pfx 时没有遇到任何问题。在我的证书详细信息中,我可以看到一个小图标,表示附加的私钥。

我修改了我的客户端以从我的个人存储中检索证书。但我遇到了完全相同的失败。

最佳答案

解决方案是在我的 Windows 机器上导入我的 CA 根证书。我的客户现在可以完成握手了!

通过搜索更完整的 SslStream 示例找到了解决方案。感谢http://geekswithblogs.net/luskan/archive/2007/10/01/115758.aspx .

关于c# - SslStream 客户端无法完成与 Stunnel 服务器的握手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11474747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com