6

我有一个完全可操作的系统,其中基于 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())。有用。验证方法返回 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 示例执行链验证。它显示证书上的各种信息,包括两条有趣的消息:

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)。在我的个人密钥库中导入 cert.pfx 没有问题。在我的证书详细信息中,我可以看到一个小图标,指示附加的私钥。

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

4

1 回答 1

4

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

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

于 2012-07-13T20:36:44.470 回答