HttpWebRequest GetResponse()出现”要求已经中止: 无法建立 SSL/TLS 的安全通道”错误

之前因为工作需求写了一只小程序,每天在固定时间连线到台银抓取当日收盘汇率

今天心血来潮去看看这只程序是否安好时,发现从7月开始的汇率都没抓到

打开程序的log,看到一整排的“要求已经中止: 无法建立 SSL/TLS 的安全通道”

连回台银的汇率网站,发现台银已经改用https了


之前因为工作需求写了一只小程序,每天在固定时间连线到台银抓取当日收盘汇率

今天心血来潮去看看这只程序是否安好时,发现从7月开始的汇率都没抓到

打开程序的log,看到一整排的“要求已经中止: 无法建立 SSL/TLS 的安全通道”

连回台银的汇率网站,发现台银已经改用https了

拿这个错误消息直接喂狗,得到的解法几乎都是加上一段

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

但我加上后却还是出现一样的错误消息

后来看到卡卡米写的文章

在调用GetResponse()前加上这段程序,指定使用TLS 1.2,程序就能正常运行了

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

朝着这个方向去寻找原因,发现程序默认使用的是SSL 3.0及TLS 1.0

在黑大的这篇文章中有提到

.NET 客户端使用 WebClient、WCF 以 HTTPS 连线远端主机,也会涉及 TLS 1.0/1.1/1.2 版本议题,不同版本 .NET 的处理方式不同: 
.NET 4.6 内建支持且默认使用 TLS 1.2 
.NET 4.5 内建支持,但需透过 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 设为默认协定
.NET 4 本身不支持,但安装 .NET 4.5 后即可使用 TLS 1.2,指定 TLS 1.2 的写法为 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; 
(注:若不想修改 .NET 4/4.5 程序,也可透过 Registry 修改默认安全协定) 
.NET 3.5 需安装 Hotfix 才能支持 
    KB3154518 – Reliability Rollup HR-1605 – NDP 2.0 SP2 – Win7 SP1/Win 2008 R2 SP1 
    KB3154519 – Reliability Rollup HR-1605 – NDP 2.0 SP2 – Win8 RTM/Win 2012 RTM 
    KB3154520 – Reliability Rollup HR-1605 – NDP 2.0 SP2 – Win8.1RTM/Win 2012 R2 RTM 
    KB3156421 -1605 HotFix Rollup through Windows Update for Windows 10.

而我程序使用的.NET版本为4.5.2,因此需要另外指定使用TLS 1.2

参考文章:
卡卡米的内存 - Google在 SSL 3.0 中发现设计缺陷
黑暗线程 - Windows 停用 TLS 1.0 之配套作业整理