問題:
【SSL】WebClient 請求 https 頁面出錯:未能創建 SSL/TLS 安全通道
代碼:
/** post 表單的方式發送請求數據 **/ public String sendMessage(String postUrl, NameValueCollection postData) { ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult); //WebClient web = new WebClient(); //byte[] respData = web.UploadValues(postUrl, "POST", postData); //String resp = Encoding.UTF8.GetString(respData); String resp; using (SecureWebClient client = new SecureWebClient()) { byte[] respData = client.UploadValues(postUrl, "POST", postData); resp = Encoding.UTF8.GetString(respData); } return resp; } /// <summary> /// 總是接受 認證平台 服務器的證書 /// </summary> /// <param name="sender"></param> /// <param name="certificate"></param> /// <param name="chain"></param> /// <param name="errors"></param> /// <returns></returns> public static bool CheckValidationResult(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors errors) { // 總是接受 認證平台 服務器的證書 return true; } /// <summary> /// https雙向認證 /// </summary> public class SecureWebClient : WebClient { /// <summary> /// 加載證書 /// </summary> /// <param name="address"></param> /// <returns></returns> protected override WebRequest GetWebRequest(Uri address) { HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); var cer = new X509Certificate2(Config.GetValue("MinSheng_custPriPfxPath"), Config.GetValue("MinSheng_custPriPfxPwd")); request.ClientCertificates.Add(cer); return request; } }
注:
當調用 X509Certificate2 的時候,會提示找不到文件而報錯。
發現文件也是存在的,就是這個函數讀取不了,網上查了一下,發現是IIS的程序池配置問題,雲服務器上的自動加載配置文件設為Fasle的,只要在你網站的程序池中,設置為True就解決了。