1. 程式人生 > >未能建立 SSL/TLS 安全通道解決方案

未能建立 SSL/TLS 安全通道解決方案

操作

當向一個https的url上傳送請求,報錯:未能建立 SSL/TLS 安全通道;

報錯前實現程式碼如下:

/// <summary>
/// 判斷遠端檔案是否存在
/// </summary>
/// <param name="fileUrl">檔案路徑</param>
/// <returns></returns>
public ActionResult FileExists(string fileUrl)
{
var result = new ResultModel();
HttpWebRequest re = null;
HttpWebResponse res 
= null; try { re = (HttpWebRequest)WebRequest.Create(fileUrl); res = (HttpWebResponse)re.GetResponse(); if (res.ContentLength != 0) { result.Success = true; } } catch (Exception ex) { result.Success = false; result.Message = ex.Message; } finally { if (re != null) { re.Abort();//銷燬關閉連線 } if (res != null
) { res.Close();//銷燬關閉響應 } } return Json(result, JsonRequestBehavior.AllowGet); }

原因:

ssl證書不受信任,驗證失敗;

解決方案:

1:先加入名稱空間

using System.Net.Security;    
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;

2:再過載CheckValidationResult方法,返回true

public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)         {

            //直接確認,否則打不開    

            return true;

        }

3:然後在HttpWebRequest req =(HttpWebRequest) WebRequest.Create(URL)前面加上如下一行程式碼

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);//驗證伺服器證書回撥自動驗

 

最終實現程式碼如下:

  /// <summary>
        /// 判斷遠端檔案是否存在
        /// </summary>
        /// <param name="fileUrl">檔案路徑</param>
        /// <returns></returns>
        public ActionResult FileExists(string fileUrl)
        {
            var result = new ResultModel();
            HttpWebRequest re = null;
            HttpWebResponse res = null;
            try
            {
                ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
                re = (HttpWebRequest)WebRequest.Create(fileUrl);
                res = (HttpWebResponse)re.GetResponse();
                if (res.ContentLength != 0)
                {
                    result.Success = true;
                }
            }
            catch (Exception ex)
            {

                result.Success = false;
                result.Message =ex.Message;

            }
            finally
            {
                if (re != null)
                {
                    re.Abort();//銷燬關閉連線
                }
                if (res != null)
                {
                    res.Close();//銷燬關閉響應
                }
            }
            return Json(result, JsonRequestBehavior.AllowGet);
        }