我有一个完全可操作的系统,基于openssl的客户端与openssl服务器交互。每个客户端都有自己的证书,由服务器验证。已使用openssl(X509,pem)生成证书。他们是自签名的。
我现在想要编写一个基于SslStream的测试客户端。我使用了SslStream类documentation中的客户端示例。
我的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
目前永远不会被召唤(令我惊讶)。
我该如何调试?如果你可以解决我的问题,那就更好了。
更新
我添加了一个函数来根据文档中的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)。我在个人密钥库中导入cert.pfx没有问题。在我的证书详细信息中,我可以看到一个小图标,表示附加的私钥。
我修改了我的客户端以从我的个人商店中检索证书。但我得到了同样的失败。
答案 0 :(得分:4)
解决方案是在我的Windows计算机上导入我的CA根证书。我的客户现在能够完成握手!
通过搜索更完整的SslStream示例找到解决方案。感谢http://geekswithblogs.net/luskan/archive/2007/10/01/115758.aspx。