本文介紹了帶有TLS 1.3的Java 11 SSLHandshakeException:如何恢復到TLS 1.2?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我的應用程序是一種”Web Screper”形式,它使用the Java Jsoup library從所需的輸入頁面加載HTML。我最近將我的應用程序平臺從Java 8升級到Java 11。在這次升級中,我收到了幾個來自我的客戶的報告,他們說他們在試圖加載某些網(wǎng)頁的HTML內(nèi)容時收到SSLHandshakeExceptions。發(fā)生這些情況的網(wǎng)頁因設(shè)備而異,并且在某些設(shè)備上,我的客戶端根本無法加載任何網(wǎng)頁(既不能加載http://也不能加載http://網(wǎng)頁)。
我嘗試了幾種方法來解決這個問題,但都無濟于事:
-
用Java 8運行時的CACERT文件替換Java 11運行時的CACERT文件
創(chuàng)建自定義的SSL證書接受器,該證書接受器接受所有的SSL證書,而不考慮其有效性(我知道這不利于生產(chǎn)代碼,但這只是出于測試目的)-請參閱Trusting all certificates using HttpClient over HTTPS
在這一點上,我真的不確定要采取什么選項,因為我對SSL、TLS和HTTPS的了解有限。這些錯誤在Java 8中從未發(fā)生過,在升級到Java 11之前一切正常。
據(jù)我所知,Java 11對SSL唯一的改變是升級到TLS 1.3,而之前的Java版本依賴于使用TLS 1.2。
因此,我想強制Java 11使用TLS 1.2而不是TLS 1.3,因為我認為這是SSLHandshakeExceptions的原因。我應該如何著手進行此操作?
推薦答案
NeardupeJava 11 HTTPS connection fails with SSL HandshakeException while using Jsoup但我有一些要添加。
使用Connection.sslSocketFactory(factory)和合適的參數(shù)。假設(shè)使用標準/默認提供者,您可以使用從SSLContext.getInstance("TLSv1.2")
創(chuàng)建的工廠,該工廠可能帶有默認的信任管理器和密鑰管理器,即.init(null,null,null)
。
或按the JSSE documentation中的表8-3設(shè)置jdk.tls.client.protocols
或https.protocols
。注意:這可能會影響從同一JVM建立的任何其他SSL/TLS連接或用于HTTPS的其他URLConnection。
不過,如果這解決了您的問題,我會感到驚訝。TLS1.3被推遲了年,部分原因是他們添加了黑客攻擊,以便不會在舊版1.2(甚至更早的)系統(tǒng)和‘盒’上失敗。
這篇關(guān)于帶有TLS 1.3的Java 11 SSLHandshakeException:如何恢復到TLS 1.2?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,