當前位置:編程學習大全網 - 源碼下載 - Received fatal alert: handshake_failure排查過程

Received fatal alert: handshake_failure排查過程

本文重在排查問題的過程,解決方法得視情況而定。網上千篇壹律的解決方法,可能都不適合您,所以排查問題過程才是重中之重。

問題 :

系統升級了壹些jar(漏洞掃描,必須升級)。請求某銀行失敗,異常堆棧信息:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure,回滾系統壹切正常。

原因分析:

針對問題,有2個方向(正方向:從升級jar方向排查,反方向:從錯誤原因出發)

1、正方向:

由於是通訊層面的錯誤,懷疑是升級ponents/.debug=ssl ,運行時加上即可(不知道怎樣加也可以百度,因為筆者有過百度idea的經歷)。

測試正常請求日誌:

測試異常請求日誌:

從異常日誌看出,client_hello就異常了,在這裏筆者,還以為找到了答案,因為網上千篇壹律的說TLSv1.xx協議不壹樣,從異常日誌所得確實不壹樣,於是按照百度所得改協議,發現沒啥用,而且日誌打印還是壹模壹樣的錯誤(不排除讀者沒改對,備註:這個參數筆者都改過:jdk.tls.disabledAlgorithms)。

? 後來筆者又仔細看了正常請求日誌,發現正常請求SSL協議也不壹致,我方是TSLv1.2,對方是SSLv3,也是正常的,筆者就無從著手了,於是每壹行,每壹行的日誌對比(心酸得很,都是因為對SSL握手理解不透徹),發現是Cipher Suites 包含的算法不壹樣,支持的算法少了很多!到此時筆者突然想到正方向升級httpClient內容過濾掉了壹些弱密碼組件,肯定是這裏的問題,又仔細看看了正常日誌,發現調用方始終用的是SSL_RSA_WITH_3DES_EDE_CBC_SHA加密方式,而升級httpClient後,打印的我方支持的密碼組件沒有這個(Cipher Suites列表沒有)。猜測就是這個原因了(前文提到SSL目的1, 客戶端與服務器需要就壹組用於保護數據的算法達成壹致 ),這裏明顯不壹致,所以握手失敗了,於是查看httpClient源碼。

驗證上面結論是否可以行,測試傳遞密碼套件SSL_RSA_WITH_3DES_EDE_CBC_SHA(本例中,只改了httpClientUtils工具類),果然測試通過(握手成功,交易正常)。

回顧及結論:

1、對SSL握手過程理解不是很清楚,本文client_hello階段握手失敗,客戶端把支持的加密套件、版本號信息等發給服務端,以供服務端選取合適支持的加密套件。然兒本例中,服務端指定了SSL_RSA_WITH_3DES_EDE_CBC_SHA加密套件,升級httpClient過濾掉了該弱密碼套件,所以導致ssl握手失敗。

2、網上千篇壹律的說是兩邊(客戶端與服務端)支持的"SSLv3","TLSv1","TLSv1.1","TLSv1.2",不壹樣,其實也是正確的。在本例中服務端采用的是jdk1.6支持的SSLv3協議並指定了SSL_RSA_WITH_3DES_EDE_CBC_SHA加密套件,而我方(客戶端)client_hello發送支持加密套件不支持此套件,所以導致握手失敗。如果服務端沒有指定加密算法,那麽我方(客戶端)指定協議是可以握手成功的。

3、遇到問題,我們不能盲目百度,生搬硬套,要善於思考。看似復雜,無從下手的問題,往往解決方案非常簡單。還是筆者中學老師說的對,真相往往真的在表面, 正確答案(真相)在看妳,而妳確視而不見 。

  • 上一篇:股票市場中的時間節點是什麽意思?如何計算出來每月的時間節點的?請具體詳細說明 感謝~~高人指點
  • 下一篇:妳對遊戲3D建模了解多少?
  • copyright 2024編程學習大全網