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

Ste*_*ter 3 ssl javafx self-signed webview http2

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

\n

在 JavaFX 14 之前,我们一直通过使用and实现自定义TrustHandlerand\xc2\xa0来处理此问题。HostnameVerifierHttpsURLConnection.setDefaultSSLSocketFactoryHttpsURLConnection.setDefaultHostnameVerifier

\n

当我切换到 JavaFX 14 且 WebView 尝试加载自签名网页时

\n
    \n
  • 他们不加载,
  • \n
  • 不再调用自定义 TrustHandler 代码,并且
  • \n
  • 我从\xc2\xa0 得到这个webView.getEngine().getLoadWorker().getException():\n
      java.lang.Throwable: SSL handshake failed  \n  \xc2\xa0at javafx.web/javafx.scene.web.WebEngine$LoadWorker.describeError(WebEngine.java:1431)  \n  \xc2\xa0at javafx.web/javafx.scene.web.WebEngine$LoadWorker.dispatchLoadEvent(WebEngine.java:1370)  \n  \xc2\xa0at javafx.web/javafx.scene.web.WebEngine$PageLoadListener.dispatchLoadEvent(WebEngine.java:1231)  \n  \xc2\xa0at javafx.web/com.sun.webkit.WebPage.fireLoadEvent(WebPage.java:2514)  \n  \xc2\xa0at javafx.web/com.sun.webkit.WebPage.fwkFireLoadEvent(WebPage.java:2359)  \n  \xc2\xa0at javafx.web/com.sun.webkit.network.URLLoaderBase.twkDidFail(Native Method)  \n  \xc2\xa0at javafx.web/com.sun.webkit.network.HTTP2Loader.notifyDidFail(HTTP2Loader.java:624)  \n  \xc2\xa0at javafx.web/com.sun.webkit.network.HTTP2Loader.lambda$didFail$18(HTTP2Loader.java:606)  \n  \xc2\xa0at javafx.web/com.sun.webkit.network.HTTP2Loader.lambda$callBackIfNotCanceled$10(HTTP2Loader.java:437)  \n  \xc2\xa0at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)  \n  \xc2\xa0at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)  \n  \xc2\xa0at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)  \n  \xc2\xa0at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)  \n  \xc2\xa0at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)  \n  \xc2\xa0at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)  \n  \xc2\xa0at java.base/java.lang.Thread.run(Thread.java:830) \n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

我在 JavaFX 13.0.2 上没有问题,但在 14 或 14.0.1 上失败。\xc2\xa0\n奇怪的是,如果我在 11.0.2 之前的 OpenJDK 上运行,即使使用 JavaFX 14 也没有问题,但问题出现了从 12 到 15ea20。

\n

通过查看 JavaFX 和 JDK 的发行说明,我认为唯一可能的原因是 \xc2\xa0 JDK-8211308 -\xc2\xa0Support HTTP/2 in WebView。\xc2\xa0\n这意味着远离使用 xc2xa0JDK 的URLConnection类,我猜测这可能会导致它不再使用我的自定义 TrustHandler。

\n

如果我是正确的,那么我需要知道如何继续使用我的自定义 TrustHandler 来进行 WebView 下启动的连接,但我看不到如何从 java.net.http 中的 API 执行此操作。

\n

或者,增强描述提到:

\n
\n

将提供运行时属性以回退到旧版 HTTP API

\n
\n

但我找不到任何其他提及这一点 - 我如何使用这个后备?\xc2\xa0\n或者是否有一些替代方法让 WebView 允许自签名证书?\xc2\xa0\n或者我错了JavaFX 14 发生了什么变化,还有其他解决方案吗?

\n

wlc*_*crs 5

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