記錄一次Https請求的報異常請求被中止: 未能創建 SSL/TLS 安全通道的問題


問題

使用了TLS1.2還是報異常 請求被中止: 未能創建 SSL/TLS 安全通道。(The request was aborted: Could not create SSL/TLS secure channel. )
問題描述如上,寫在這里方便搜索引擎抓取,希望可以幫到同行,也作為一次踩坑的記錄。

前言

項目中需要請求第三方接口進行數據交互,我方為接口服務調用方,接口提供方的站點僅開放了Https請求端口。在本地開發功能時一切正常,項目打包丟到服務器上就會報錯
請求被中止: 未能創建 SSL/TLS 安全通道。 (The request was aborted: Could not create SSL/TLS secure channel.)

過程

C#請求https接口需要在發送請求前設置一下請求的協議,一般來說加上以下代碼

//始終驗證服務器證書
ServicePointManager.ServerCertificateValidationCallback = 
(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => { return true;};
//設置協議
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3  | 
                                       SecurityProtocolType.Tls12 | 
                                       SecurityProtocolType.Tls11 | 
                                       SecurityProtocolType.Tls;

如果 項目的.NetFramework版本過低 System.dll Version=2.0.0.0, SecurityProtocol 枚舉類型只有Ssl3和Tls時,可以像下面這樣寫:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | 
                                       SecurityProtocolType.Tls | 
                                       (SecurityProtocolType)192 | 
                                       (SecurityProtocolType)768 | 
                                       (SecurityProtocolType)3072;

一般來說,寫到這里問題就解決了。但是加了這個,程序在服務器上依然報錯,請求被中止: 未能創建 SSL/TLS 安全通道。
首先想到的是服務器環境的問題,放個Postman到服務器上,請求目標站點API,請求通過,成功拿到數據... 刪除Postman
這樣來看就是IIS的問題了,應該是IIS作為客戶端請求對方服務端請求失敗了。 為了驗證IIS到底支不支持請求HTTPS,我將接口的域名換成了 https://www.baidu.com/api/... ,捕獲到的異常不再是 "請求被中止: 未能創建 SSL/TLS 安全通道。",變成了 錯誤代碼404.這樣看來就是目標站點的問題。使用 https://myssl.com/ 測試一下

發現目標服務器只支持TLS1.2且只支持一種TLS加密套件,並且客戶端模擬握手很多低版本客戶端都會握手失敗,問題可能就是出現在這里

再到我方服務器下查找支持的TLS加密套件 ,WIN+R鍵 輸入 gpedit.msc 進入組策略編輯器,計算機配置(Computer Configuration)->管理模板(Administrative Templates)->網絡(Network)->SSL配置設置(SSL Configuration Settings)->SSL密碼套件順序(SSL Cipher Suite Order) 點擊已啟用(Enabled),把下方的SSL密碼套件復制出來放到文本編輯器里(這里我用Win10的截圖)

果然在這里沒找到目標服務器支持的TLS1.2套件,僅支持一種套件這種情況肯定是對方服務器做了限制,溝通后讓對方放開了部分TLS1.2套件,請求接口后終於不再報異常了。

結語

經過一系列的調試,最后發現是我方服務器的IIS不支持目標服務器的TSL的加密套件,導致https 請求第一次握手失敗。
以下文章起到了很大的幫助,感謝!!
https://bbs.csdn.net/topics/392432872
https://blog.csdn.net/pijianzhirui/article/details/70198695


免責聲明!

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



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