以前寫了一個桌面程序,程序會間歇性訪問某個https接口,一直用的好好的,今天忽然報錯了,異常就發生在訪問接口的地方,曰「請求被停止,未能建立 SSL/TLS 安全通道。」,另外有臺電腦也有跑該程序,也是一樣的報錯,看來是接口方改動過什麼了。安全
搜索一番,緣由應該是,接口方變動了安全協議,而客戶端並未啓用該協議。解決辦法天然就是:讓客戶端啓用該協議。具體就是在發起網絡請求以前確保ServicePointManager.SecurityProtocol中含有服務端所用的安全協議,若是不知道或但願客戶端健壯一點,固然最簡單的方式就是把全部可用的協議都啓用,隨你服務端未來怎麼換。代碼以下:網絡
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
但若是客戶端是基於.net framework 4.0,SecurityProtocolType枚舉中並無Tls11和Tls12,這就須要直接填值:框架
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | (SecurityProtocolType)0x300 //Tls11 | (SecurityProtocolType)0xC00; //Tls12
如此便可。spa
事實上,這個問題正是由於個人客戶端是基於.net 4.0的,而4.0的ServicePointManager.SecurityProtocol默認就不含Tls11和Tls12,因此當服務端改用這兩種安全協議時,天然訪問不了。操作系統
201903081051更新:.net
然而事情並無這麼簡單,按上述方法改好程序後,在有些電腦是能正常工做了,但在有臺電腦仍然報錯,只不過報錯變成了「The requested security protocol is not supported」,中文應該是「不支持請求的安全協議」。搜索得知,須要在電腦上安裝.net 4.5或更高版本的框架才行,對,即使程序項目框架只是4.0。code
也就是說,若是操做系統是nt5.x(xp/2003),沒戲,由於XP最高只能安裝到.net 4.0,只能升級系統;而若是程序是基於4.0如下的版本,如2.0、3.5,那安裝4.5+也不行,能不能解決和怎麼解決我不知道,這篇文章看似相關,但我沒實踐,讀者有須要的話可自行嘗試。blog
相信隨着愈來愈多服務端採用新協議,老邁的nt5.x之後會連上網都成問題,這是一個活生生的因發展而形成老產品被實質淘汰的案例。接口
-EOF-get