繁体   English   中英

SslStream客户端无法完成与stunnel服务器的握手

[英]SslStream client unable to complete handshake with stunnel server

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

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

我的SslStream客户端无法完成握手。 stunnel抱怨客户没有发送证书。 这在Wireshark中确认(证书长度:握手消息中的0)。

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

内部异常:收到的消息是意外的或格式错误

这是我加载证书的方式:

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 (令我惊讶)。

我该怎么调试呢? 如果你可以解决我的问题,那就更好了。

UPDATE

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

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

最后,我没有比调用验证时更多的细节。

openssl verify cert.pem的输出不报告任何异常。

error 18 at 0 depth lookup:self signed certificate
OK

UPDATE

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

我修改了我的客户端以从我的个人商店检索证书。 但我得到了同样的确切失败。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM