之前處理過很多ThreadX平臺及安卓平臺上的SSL問題。
SSL問題幾乎都和握手失敗有關,大致分爲四種:
1.客戶端沒有與服務器相匹配的加密套件,以及SSL版本不匹配。
2.SSL證書錯誤。
3.網絡鏈路問題。
4.其他問題。
這時使用wireshark抓取網絡報文就顯得很重要了,下面列出的是使用PC模擬以上問題情況的報文:
正常報文:
PC端命令:openssl s_client -connect www.sogou.com:443
通過https://myssl.com/,已經查到118.184.170.59不支持DES-CBC3-SHA (TLS_RSA_WITH_3DES_EDE_CBC_SHA) 加密套件,此網址可以快速知曉服務端支持的各種信息。
1.客戶端沒有與服務器相匹配的加密套件,或者SSL版本不匹配。
可以用火狐瀏覽器SSL版本查看與設置來模擬服務器是否支持某個版本TLS:
https://blog.csdn.net/weixin_30396699/article/details/98960323
或者用下面類似的openssl命令來模擬SSL連接,wireshark抓取網絡報文對比分析。
PC端命令:openssl s_client -cipher DES-CBC3-SHA -connect www.sogou.com:443
上圖服務器的fatal警告很明顯表示客戶端的client hello報文有問題。
根據https://myssl.com/信息,對應加密套件不匹配。
解決方案:增加加密套件或更換版本。
2.SSL證書錯誤。
1)系統時間不對導致握手失敗。
解決方案:本地時間同步或者修正時間。
2)服務器證書有問題。
解決方案:客戶端可以不驗證服務器證書,需要注意安全問題。
3)證書驗證算法不支持。
解決方案:擴展相應的如SHA384摘要算法。
3.網絡鏈路問題。
此種問題一般很好查,與服務端有很多重傳報文,且最後客戶端一直重傳,服務端沒有回覆,回覆包括RST、警告報文,超時之後斷開連接。
4.其他問題。
前面幾種是比較好查的,下面是遇到的比較個例的問題:
1) 服務器僅支持HTTP2.0導致的問題:
大家應該清楚ALPN,其實質上是TLS的擴展,爲了協商應用層協議,如HTTP2.0
之前是在android4.4平臺手機無法訪問亞馬遜的語音平臺。
首先無法握手成功,經過查看源碼,android4.4平臺,openssl爲1.0.1版本,雖然支持亞馬遜的加密套件,但是framework層沒有完全擴展加密套件。
故此修改方案無法完全生效:
Android解決okhttpUtils框架無法在4.4.4以下系統訪問https協議的問題
https://blog.csdn.net/weixin_30267253/article/details/72417399
需在framework層添加所需加密套件的調用。此處略。
之後握手成功,但每次HTTP請求,服務器會直接RST,對比正常報文發現ALPN字段。
解決方案: 需升級平臺OpenSSL 1.0.2版本(支持ALPN)並升級支持HTTP2.0。
2)SNI不支持導致的握手失敗。
Server Name Indication是 TLS 的擴展,用來解決一個服務器擁有多個域名的情況。
PC端正常命令:openssl s_client -tls1_2 -connect partner-listing.thredup.com:443 -servername partner-listing.thredup.com
PC端模擬SNI不支持導致握手失敗命令:openssl s_client -tls1_2 -connect partner-listing.thredup.com:443
同正常訪問的client hello報文做對比
正常報文:
SNI不支持:
解決方案: 支持SNI。