关于TCP+SSL协议通讯问题

由于客户的临时要求,需要将原有TCP/IP通讯改成TCP+SSL协议的通讯模式。但是测试服务后台的证书是过期的,因此我方得取消SSL的身份验证。

说真的,我从来没接触过SSL,而现有通讯是使用C++编写,真的是赶着鸭子上架,一头雾水没有方向。同事同学能够远水救近火帮上忙的也很少,只能零星的从网上查找资料。而客户方一天N个电话追问什么时候能够完成,极度烦躁。

网上可以找到不少完整的代码,发现都是基于.NET的源码,而C++使用openSSL协议需要引用各种openSSL的头文件,同时得安装openSSL环境(在Windows系统下参照资料几次都不成功)。于是只能在试着使用C#语言进行通讯。

粗略的理顺查找到的资料,分析然后测试,结果悲剧的发现第二次握手身份验证没有通过。可是查尽所有的资料,都提示只需要将函数

public static bool ValidateServerCertificate(object sender,X509Certificate certificate,X509Chain chain,SslPolicyErrors sslPolicyErrors);--a

直接返回true,而后在TCP连接前设置:

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);--b

,即可控制忽略身份验证。

 幸运的是,不抱希望对sslStream可能的方法依次尝试,增加了如下代码行

 sslStream.AuthenticateAsClient(machineName,null, SslProtocols.Ssl3, false);--c

将sslStream.AuthenticateAsClient第二个参数客户端证书设为null。惊喜的发现通讯成功了。太激动了。呵呵。

之后,将a返回false或b行注释,都不影响其通讯。当然,在定义SSL 流时,必须将下行d代码中ValidateServerCertificate的返回为true忽略身份验证.

SslStream sslStream = new SslStream(client.GetStream(), false ,new RemoteCertificateValidationCallback(ValidateServerCertificate), null);--d

posted @ 2012-11-23 23:43  水星人已隐匿  阅读(1775)  评论(0编辑  收藏  举报