背景:
客戶的核心系統環境從原來的(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”
解決過程:
客戶的核心系統環境從原來的(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
后面覺得可能是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