有時候需要在C#的程式裡面發出request和內部或者外部的服務溝通,如果內部或者外部的服務只允許https連線,而且的ssl憑證並沒有經過認證(有可能是用self signed certifcate),那麼C#會直接出錯: system.security.authentication.authenticationexception the remote certificate is invalid according to the
validation procedure System.Net.Http.HttpRequestException: 傳送要求時發生錯誤。 ---> System.Net.WebException: 基礎連接已關閉: 無法為 SSL/TLS 安全通道建立信任關係。 一般來說要解決這個問題有兩個做法: 這篇將會對於第二個做法,調整程式讓發出request遇到這種問題的時候能夠處理這種問題。 問題發生原因基本上合法的ssl憑證一定會是由一個可信任的機構發出,不過有時候有些服務只是要把通訊的管道加密,為了節省成本(或者其他什麼原因)而使用了self sign certificate (自我簽章的憑證)。 理論上任何會對外被呼叫到的https網站都不應該用self sign certificate,因此,從C#發出的https request(不管是用 也就是因為這個檢查導致出現錯誤。 解決方式取決於你的target platform是什麼,有兩種解決方式:
.Net Framework裡面的處理方式 基本上有個全域的事件叫做
不過這個有點太大,因此建議還是針對性的去通過比較好,舉例來說,假設有ssl憑證的host是:
程式應該還蠻好理解:
或許你會說幹嘛這麼麻煩,何不都過就好?這個其實是為了明確定義那些是特例可以通過,那些不可以。 要記得,這個修改是全域都有作用,換句話說所有送出的request,包含像是Xml Web Service這種reference都會吃,因此明確一點比較好。 .Net Core裡面的處理方式 在.Net Core裡面會發現沒有
因為這個設定是和某一個client有關,因此直接全部return true比較不會有問題 - 不像上面是一個全域的事件。 結語基本上這個問題透過google就能夠找到,不過比較少有提到判斷host的部分(都是直接return true),因此這邊做一個記錄方便以後找到。 如果文章對您有幫助,就請我喝杯飲料吧 公司將一些網站改走SSL後發現有些POST取資料功能失效了 ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;<=加入 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;<=加入 參考來源 2019-07-07 C# HttpReques 基礎連接已關閉: 無法為 SSL/TLS 安全通道建立信任關係 強制跳過 TLS驗證
如提 C# HttpReques 基礎連接已關閉: 無法為 SSL/TLS 安全通道建立信任關係 強制跳過 TLS驗證 參考來源 http://www.coco-in.net/thread-150342-1-1.html https://blog.alantsai.net/posts/2017/12/csharp-ssl-remote-validation-error 可能會遇到這個畫面 實際寫法
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; HttpWebRequest request = HttpWebRequest.Create(targetUrl) as HttpWebRequest;
string jsondata = ""; 就可以解決了 以上文章僅用紀錄資料使用..... |