2018-07-08 HttpWebRequest GetResponse()出現"要求已經中止: 無法建立 SSL/TLS 的安全通道"錯誤
之前因為工作需求寫了一隻小程式,每天在固定時間連線到台銀抓取當日收盤匯率 今天心血來潮去看看這隻程式是否安好時,發現從7月開始的匯率都沒抓到 打開程式的log,看到一整排的「要求已經中止: 無法建立 SSL/TLS 的安全通道」 連回台銀的匯率網站,發現台銀已經改用https了 之前因為工作需求寫了一隻小程式,每天在固定時間連線到台銀抓取當日收盤匯率 今天心血來潮去看看這隻程式是否安好時,發現從7月開始的匯率都沒抓到 打開程式的log,看到一整排的「要求已經中止: 無法建立 SSL/TLS 的安全通道」 連回台銀的匯率網站,發現台銀已經改用https了 拿這個錯誤訊息直接餵狗,得到的解法幾乎都是加上一段
但我加上後卻還是出現一樣的錯誤訊息 後來看到卡卡米寫的文章 在呼叫GetResponse()前加上這段程式,指定使用TLS 1.2,程式就能正常運作了
朝著這個方向去尋找原因,發現程式預設使用的是SSL 3.0及TLS 1.0 在黑大的這篇文章中有提到
而我程式使用的.NET版本為4.5.2,因此需要另外指定使用TLS 1.2 參考文章: 在网上查了很多资料,基本是这么一个思路: 此时我发现问题可以解决,但是有一个问题是这种方法在在 .net 4.5以上是没问题的,因为如下: v4.0 #region 程序集 System.dll, v4.0.0.0
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll
#endregion
using System;
namespace System.Net
{
// 摘要:
// 指定 Schannel 安全包支持的安全协议。
[Flags]
public enum SecurityProtocolType
{
// 摘要:
// 指定安全套接字层 (SSL) 3.0 安全协议。
Ssl3 = 48,
//
// 摘要:
// 指定传输层安全 (TLS) 1.0 安全协议。
Tls = 192,
}
} v4.5 #region 程序集 System.dll, v4.0.0.0
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.dll
#endregion
using System;
namespace System.Net
{
// 摘要:
// 指定 Schannel 安全包支持的安全协议。
[Flags]
public enum SecurityProtocolType
{
// 摘要:
// 指定安全套接字层 (SSL) 3.0 安全协议。
Ssl3 = 48,
//
// 摘要:
// 指定传输层安全 (TLS) 1.0 安全协议。
Tls = 192,
//
Tls11 = 768,
//
Tls12 = 3072,
}
} 假如在.net 4.0上使用如下代码时一样报错 System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls; 此时我想在.net 4.0或者以下版本使用上面的方法就不可行,那么怎么办? System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 | (SecurityProtocolType)768 | (SecurityProtocolType)3072;
ServicePointManager.ServerCertificatidationCallback = new System.Net.Security.RemoteCertificatidationCallback(CheckValidationResult);//验证服务器证书回调自动验证 虽然.net 4.0 SecurityProtocolType 枚举中没有 Tls11 和Tls12 两种类型那么我们只能强转!!!!! |