首页 > 解决方案 > 如何使用 JavaFX 14/HTTP2/JDK-8211308 让 JavaFX WebView 继续加载带有自签名证书的页面

问题描述

谁能告诉我更新到 JavaFX 14 后如何在 WebView 中使用自签名 https 证书继续显示网页?

在 JavaFX 14 之前,我们一直通过使用 HttpsURLConnection.setDefaultSSLSocketFactory 和 HttpsURLConnection.setDefaultHostnameVerifier 实现自定义 TrustHandler 和 HostnameVerifier 来处理这个问题。当我切换到 JavaFX 14 并且 WebView 尝试加载他们不加载的自签名网页时,不再调用自定义 TrustHandler 代码,我从 webView.getEngine().getLoadWorker().getException() :

    java.lang.Throwable: SSL handshake failed  
     at javafx.web/javafx.scene.web.WebEngine$LoadWorker.describeError(WebEngine.java:1431)  
     at javafx.web/javafx.scene.web.WebEngine$LoadWorker.dispatchLoadEvent(WebEngine.java:1370)  
     at javafx.web/javafx.scene.web.WebEngine$PageLoadListener.dispatchLoadEvent(WebEngine.java:1231)  
     at javafx.web/com.sun.webkit.WebPage.fireLoadEvent(WebPage.java:2514)  
     at javafx.web/com.sun.webkit.WebPage.fwkFireLoadEvent(WebPage.java:2359)  
     at javafx.web/com.sun.webkit.network.URLLoaderBase.twkDidFail(Native Method)  
     at javafx.web/com.sun.webkit.network.HTTP2Loader.notifyDidFail(HTTP2Loader.java:624)  
     at javafx.web/com.sun.webkit.network.HTTP2Loader.lambda$didFail$18(HTTP2Loader.java:606)  
     at javafx.web/com.sun.webkit.network.HTTP2Loader.lambda$callBackIfNotCanceled$10(HTTP2Loader.java:437)  
     at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)  
     at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)  
     at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)  
     at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)  
     at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)  
     at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)  
     at java.base/java.lang.Thread.run(Thread.java:830) 

JavaFX 13.0.2 没有问题,但 14 或 14.0.1 失败。奇怪的是,如果我对 OpenJDK 运行到 11.0.2,即使使用 JavaFX 14 也没有问题,但是从 12 到 15ea20 都会出现问题。

通过查看 JavaFX 和 JDK 的发行说明,在我看来唯一可能的原因是 JDK-8211308 - 在 WebView 中支持 HTTP/2。这意味着不再使用 JDK 的 URLConnection 类,我猜这可能会导致它不再使用我的自定义 TrustHandler。如果我是正确的,那么我需要知道如何继续将我的自定义 TrustHandler 用于在 WebView 下发起的连接,但我无法从 java.net.http 中的 API 中看到如何做到这一点。或者,增强描述提到“将提供运行时属性以回退到传统 HTTP API”,但我找不到其他提及这一点 - 我如何使用这个后备?还是有一些替代方法可以让 WebView 允许自签名证书?或者我对 JavaFX 14 的变化有什么误解,还有其他解决方案吗?

标签: ssljavafxwebviewhttp2self-signed

解决方案


我发现它-Dcom.sun.webkit.useHTTP2Loader=false禁用了 HTTP2 支持,并解决了这个问题。


推荐阅读