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

How to get JavaFX WebView to continue to load page with self-signed certificate with JavaFX 14/HTTP2/JDK-8211308

谁能告诉我如何在更新到 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(HTTP2Loader.java:606)  
     at javafx.web/com.sun.webkit.network.HTTP2Loader.lambda$callBackIfNotCanceled(HTTP2Loader.java:437)  
     at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:428)  
     at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)  
     at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(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(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 class,我猜这可能会导致它不再使用我的自定义 TrustHandler。如果我是正确的,那么我需要知道如何继续将我的自定义 TrustHandler 用于在 WebView 下启动的连接,但我无法从 java.net.http 中的 API 看到如何做到这一点。或者,增强功能描述中提到了 "Runtime property will be provided to fallback to legacy HTTP API",但我找不到其他提及的内容 - 如何使用此回退?或者是否有其他方法让 WebView 允许使用自签名证书?还是我对 JavaFX 14 发生的变化有误,还有其他一些解决方案?

我发现 -Dcom.sun.webkit.useHTTP2Loader=false 禁用了 HTTP 2 支持,并修复了问题。