C# 解決請求被停止:沒法創建SSL / TLS安全通道問題

在網上查了不少資料,基本是這麼一個思路:
在經過 HttpWebRequest req
= (HttpWebRequest)HttpWebRequest.Create(url); req.Method = "GET"; HttpWebResponse sp = (HttpWebResponse)req.GetResponse(); 做處理時,有些輸入有些URL會在 HttpWebResponse sp = (HttpWebResponse)req.GetResponse(); 的時候拋出一個「基礎鏈接已經關閉: 未能爲 SSL/TLS 安全通道創建信任關係」的異常。 最簡單的辦法是:
1,先加入命名空間: using System.Net.Security; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates;
2,再重載CheckValidationResult方法,返回true public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; }
3,而後在HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); 前面加上以下幾行代碼: System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; ServicePointManager.ServerCertificatidationCallback = new System.Net.Security.RemoteCertificatidationCallback(CheckValidationResult);//驗證服務器證書回調自動驗證

此時我發現問題能夠解決,可是有一個問題是這種方法在在 .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上使用以下代碼時同樣報錯url

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls;

此時我想在.net 4.0或者如下版本使用上面的方法就不可行,那麼怎麼辦?spa

System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 | (SecurityProtocolType)768 | (SecurityProtocolType)3072; ServicePointManager.ServerCertificatidationCallback = new System.Net.Security.RemoteCertificatidationCallback(CheckValidationResult);//驗證服務器證書回調自動驗證

雖然.net 4.0 SecurityProtocolType 枚舉中沒有 Tls11 和Tls12 兩種類型那麼咱們只能強轉!!!!!.net

相關文章
相關標籤/搜索