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

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

问题描述:

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

我现在想写一个基于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目前从来没有被召唤(令我惊讶)。

我该如何调试?如果你能指出我的问题更好。

UPDATE

我添加了一个函数基于所述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 

UPDATE

我提取从PEM私有密钥和证书,以及我生成cert.pfx(PKCS12)。我在个人密钥存储中导入cert.pfx时没有问题。在我的证书详细信息中,我可以看到一个指示附加私钥的小图标。

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

+0

对于SSL客户端验证,您需要证书和密钥。您应该检查PEM文件是否包含这两个文件,否则您缺少一个重要部分。 – Robert 2012-07-13 17:09:57

+0

PEM包含---- ---- BEGIN CERTIFICATE -----块下的证书和----- BEGIN RSA PRIVATE KEY -----块下的私钥。 – 2012-07-13 18:17:12

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

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

+0

必须将根CA证书安装在Trusted Authorities文件夹中的Windows应用商店中,并且还必须从Windows应用商店加载客户端证书,但从文件加载客户端证书时不起作用。因此客户端和服务器根CA必须位于Windows存储中。谢谢 – AlexandruC 2014-03-18 17:41:36

+0

如果Windows/.NET不在证书存储区中,则不允许您使用私钥。这是设计。 – 2014-08-08 07:48:11