javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure


背景:
客戶的核心系統環境從原來的(Weblogic10.36,JDK1.6,后面升級成(Weblogic12C,JDK1.8

問題描述:
B2B(運行環境:WAS8.5,JDK1.6需要通過RPC訪問核心服務,通信協議采用TLS協議,系統間做雙向加密。
核心的證書是由keytool自簽而成。B2B的證書由keyman制作。證書放在應用服務器層面。

B2B訪問核心時報: “javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure”

解決過程:
做了一套新的證書放在升級后的環境,結果報錯。
后面覺得可能是TLS協議的問題,所以握手失敗。

然后開始查閱官方文檔這方面的資料: 

開啟調試SSL調試模式:
SSL調試跟蹤提供關受信任證書頒發機構,SSL服務器配置,服務器標識,SSL握手期間傳遞的SSL記錄等信息。
在JVM的啟動參數中添加:
-Djavax.net.debug=all
-Dssl.debug=true -Dweblogic.StdoutDebugEnabled=true

查看核心系統的啟動日志如下關鍵信息:
  <supportedProtocolVersions=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2> 
  
    <Using TLSv1.1 as the default minimum TLS protocol.> 
  
   *** ClientHello, TLSv1
  
   Caused By: javax.net.ssl.SSLHandshakeException: Client requested protocol TLSv1 not enabled or not supported
  
從這些信息可以看出客戶端(B2B系統發出的ClientHello的TLS1.0,而核心系統的接受的最小協議為TLS1.1,導致server hello失敗

 在JVM的啟動參數加上 "-Dweblogic.security.SSL.protocolVersion=ALL"  或者"-Dweblogic.security.SSL.minimumProtocolVersion=TLSv1"

問題得到解決

總結:
 JDK升級后可能導致TLS默認接受的最小版本協議發生改變,從而導致握手失敗。
 
 參考文檔:
  https://docs.oracle.com/middleware/12213/wls/SECMG/ssl_version.htm#SECMG634
  https://docs.oracle.com/middleware/12213/wls/SECMG/ssl_debug.htm#SECMG728


免責聲明!

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



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