javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 抗戰歷程

小蛙的工作常常要維護很多有年代的系統,這些系統有些已經找不到源頭或甚至沒有文件留下來了,前一段時間一直碰到抓 https 的時候噴錯的狀況,這篇把這段很痛苦的經歷記錄下來,希望能幫助遇到相同問題的朋友。

早期很多網站都是 http 的,到現在各家大廠的推波助瀾下,你沒有 https 就被當作是不合群的、有危險的、跟不上潮流的網站(?!),總之當有人上你的網站,但你的網站沒有 https 的時候,各大瀏覽器就會很不客氣的提示:您與這個網站的連線不安全,有些人看到這些提示怕都怕死了根本不敢連~

小蛙這次要處理的系統是早期抓網站圖片的工具,由於是早期開發的,當時幾乎都是 http 為主的網站,這支程式也完全沒有考慮 https 的問題 (當時合作的單位完全沒有 https),這一兩年來這個問題慢慢顯露出來,有些要抓的網站也在我們自己單位,因此可以透過一些特殊的方法來處理,但是今天遇到 … 要抓外面單位的網站,這 … 折騰了小蛙一整天啊。

小蛙給一個最簡單卻也是最困難的建議:更新到 JRE 1.8

小蛙試了超多網路上找到的方法,如果你已經在網路上找很久了,那小蛙用的方法你一定都試過,應該也都還是失敗 … (跟小蛙一樣),最後決定直接安裝 JRE 1.8。來看一下這討人厭的錯誤訊息

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
     at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
     at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
     at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1959)
     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1077)
     at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
     at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
     at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
     at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
     at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
     at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
     at TESTSSL.downloadRemoteImage(TESTSSL.java:37)
     at TESTSSL.downloadRemoteImage(TESTSSL.java:53)
     at TESTSSL.main(TESTSSL.java:74)

直接看小蛙 Eclipse 的設定,Compiler 的地方使用 1.7

Java Build Path 也是使用 jdk 1.7.0_45

Run Configurations 的 JRE 設定也是選擇 jdk 1.7.0_45

執行下去就是這個錯誤 …

如果手動安裝了 JRE 8,然後把 Run Configurations 的 JRE 設定成 JRE 8

就打完收工了 … 真的是太敢動 (嗚嗚嗚),原本小蛙一直想要在 1.7 的環境下想辦法處理,試了一大堆方法沒有一個可以動的,因為改來改去改到亂七八糟,就連把環境升上 1.8 也都還是不行 … 後來發現 Eclipse 執行的時候可以選擇運行環境,就決定專案的 Compiler 跟 Build Path 維持 1.7,Run Configurations 改成 JRE 1.8 … 不想繼續糾結下去 Orz … 但有一些 JSP 環境下沒辦法這樣處理的還是很頭大啊 ><

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。