以前写了一个桌面程序,程序会间歇性访问某个https接口,一直用的好好的,今天忽然报错了,异常就发生在访问接口的地方,曰“请求被停止,未能建立 SSL/TLS 安全通道。”,另外有台电脑也有跑该程序,也是一样的报错,看来是接口方改动过什么了。安全
搜索一番,缘由应该是,接口方变动了安全协议,而客户端并未启用该协议。解决办法天然就是:让客户端启用该协议。具体就是在发起网络请求以前确保ServicePointManager.SecurityProtocol中含有服务端所用的安全协议,若是不知道或但愿客户端健壮一点,固然最简单的方式就是把全部可用的协议都启用,随你服务端未来怎么换。代码以下:网络
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
但若是客户端是基于.net framework 4.0,SecurityProtocolType枚举中并无Tls11和Tls12,这就须要直接填值:框架
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | (SecurityProtocolType)0x300 //Tls11 | (SecurityProtocolType)0xC00; //Tls12
如此便可。spa
事实上,这个问题正是由于个人客户端是基于.net 4.0的,而4.0的ServicePointManager.SecurityProtocol默认就不含Tls11和Tls12,因此当服务端改用这两种安全协议时,天然访问不了。操作系统
201903081051更新:.net
然而事情并无这么简单,按上述方法改好程序后,在有些电脑是能正常工做了,但在有台电脑仍然报错,只不过报错变成了“The requested security protocol is not supported”,中文应该是“不支持请求的安全协议”。搜索得知,须要在电脑上安装.net 4.5或更高版本的框架才行,对,即使程序项目框架只是4.0。code
也就是说,若是操做系统是nt5.x(xp/2003),没戏,由于XP最高只能安装到.net 4.0,只能升级系统;而若是程序是基于4.0如下的版本,如2.0、3.5,那安装4.5+也不行,能不能解决和怎么解决我不知道,这篇文章看似相关,但我没实践,读者有须要的话可自行尝试。blog
相信随着愈来愈多服务端采用新协议,老迈的nt5.x之后会连上网都成问题,这是一个活生生的因发展而形成老产品被实质淘汰的案例。接口
-EOF-get