解決“未能創建 SSL/TLS 安全通道”異常


 

之前寫了一個桌面程序,程序會間歇性訪問某個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

如此即可。

事實上,這個問題正是因為我的客戶端是基於.net 4.0的,而4.0的ServicePointManager.SecurityProtocol默認就不含Tls11和Tls12,所以當服務端改用這兩種安全協議時,自然訪問不了。

 

201903081051更新:

然而事情並沒有這么簡單,按上述方法改好程序后,在有些電腦是能正常工作了,但在有台電腦仍然報錯,只不過報錯變成了“The requested security protocol is not supported”,中文應該是“不支持請求的安全協議”。搜索得知,需要在電腦上安裝.net 4.5或更高版本的框架才行,對,即便程序項目框架只是4.0。

也就是說,如果操作系統是nt5.x(xp/2003),沒戲,因為XP最高只能安裝到.net 4.0,只能升級系統;而如果程序是基於4.0以下的版本,如2.0、3.5,那安裝4.5+也不行,能不能解決和怎么解決我不知道,這篇文章看似相關,但我沒實踐,讀者有需要的話可自行嘗試。

相信隨着越來越多服務端采用新協議,老邁的nt5.x以后會連上網都成問題,這是一個活生生的因發展而造成老產品被實質淘汰的案例。

 

 

以上是網上找到的解決方案,然而我參照修改之后仍然無法訪問,還是報 未能創建 SSL/TLS 安全通道 ,

此時又想到一個問題,有可能是通道被關閉了,

用工具IISCrypto檢查后發現確實如此,

 

 

 

解決:將TLS 1.0 和 TLS 1.1 全部勾上,或者點擊Best Practices ,然后勾選 Reboot ,點擊 Apply  ,服務器會重啟,重啟之后果然就好了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM