[工作筆記]JDK版本不同導致的SSL異常:javax.net.ssl.SSLHandshakeException: Remote host closed connection during h...

公司:YLZF

職位:Java開發(fā)工程師

項目代號:E

前言

遇到這個問題得說一下筆者的開發(fā)環(huán)境,筆者所在公司,平時開發(fā)用的web容器是jboss,使用的JDK是oracle的JDK,但是測試和生產(chǎn)環(huán)境用的是WAS,JDK用的是IBM的JDK,由于項目的不同,測試環(huán)境所安裝的web容器和JDK版本都并不相同。這個也是筆者遇到問題的原因所在。

問題描述

筆者在公司負責一個項目的開發(fā),該項目有一個功能需要調用到公司另一個項目的接口,而那個項目提供的接口是基于HTTPS的,所以筆者在進行調用的時候,使用了JDK提供的SSL連接進行了請求。

SSLContext.getInstance(“SSL”);

該代碼,筆者在自己本機的JBoss上測試過,并沒有問題??墒牵l(fā)布到was里面之后,程序一直沒法成功調用接口,通過日志追蹤后,發(fā)現(xiàn)程序在服務器運行的時候后臺報了異常,該異常如下:

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshank

握手失敗,網(wǎng)上有人說,該異常是因為證書的原因,可是筆者嘗試過后發(fā)現(xiàn),該說法并不對應筆者所描述的場景,最后在同事的幫助下找到了原因。

問題分析

該問題出現(xiàn)的原因在于SSL協(xié)議的版本不同。發(fā)現(xiàn)問題之后,筆者分析了一下具體情況。由于項目的原因,筆者現(xiàn)在用的JDK版本還是1.5的,同時,筆者去調的項目也是個老項目,用的JDK版本也是1.5的。所以當筆者通過本地測試的時候,SSL的請求方和接收方的版本是一致的,并沒有問題??墒怯捎陧椖康臄U容,筆者項目的測試環(huán)境前陣子進行了遷移,新的測試環(huán)境采用的是IBM的JDK1.6。因為JDK版本不同,默認采用的握手協(xié)議不同,所以導致兩邊程序進行握手的時候會失敗。

仔細查詢了一下資料后發(fā)現(xiàn),原來oracle的JDK默認采用的是TLSv1和TLSv2進行嘗試握手連接的,而IBM新的JDK采用的是SSLv3,新老版本還不一樣。

詳細的資料地址:http://www-01.ibm.com/support/docview.wss?uid=swg21687173

問題解決

該問題的解決方法有兩個:

方法一:修改獲取SSL連接的的代碼(筆者使用的方法,簡單)

SSLContext.getInstance(“TLS”);

方法二:更新IBM的JDK

在上面給出的鏈接中,其實IBM已經(jīng)意識到自己的問題,也給出了另外一個補丁,據(jù)說更新后就能成功(筆者沒嘗試過( ̄▽ ̄)”)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容