最近碰到一個很弔詭的問題,透過 VS 直接對 WPF 程式跑 Debug mode,可以正常發送 HTTPS Request,但只要將此 WPF 透過 ClickOnce 發布後,發送 HTTPS Request 就會有 Exception。
Exception 的內容為 The request was aborted: Could not create SSL/TLS secure channel
不論將 .Net Framework 版本切換至 4.6.1 4.6.2 4.7 4.7.1 4.7.2 都無法解決此問題。
上網 Google 了一下,找到兩種可能的解法
- 透過設定 ServicePointManager.ServerCertificateValidationCallback,避開程式在發出 HTTPS Request 時,因簽章問題而導致發送失敗。嘗試此解法過後,確定無法解決。
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
- 將 ServicePointManager.SecurityProtocol 設定為 Tls, Tls11, Tls12, Ssl3,此方法可用!!!
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
事後追查,跑 Debug Mode 時的 ServicePointManager.SecurityProtocol 為 SystemDefault;透過 ClickOnce 安裝後的 ServicePointManager.SecurityProtocol 卻變成 Ssl3, Tls,但目前還不知道是什麼原因導致這個差異...。