ssl - 如何使用 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 的变化有什么误解,还有其他解决方案吗?
解决方案
我发现它-Dcom.sun.webkit.useHTTP2Loader=false
禁用了 HTTP2 支持,并解决了这个问题。
推荐阅读
- python - 在 Python 中调整图像大小而不损失字母质量
- tensorflow - Tensorflow Serving 从 S3 加载多个模型
- .htaccess - Wordpress 网站的 .htaccess 被黑
- javascript - 缺少标签“
“ 为了 ” “在亚马逊 MWS 订阅源中 - json - 自定义 Json Deserializer 构造函数参数为 null
- typescript - 错误 TS6059:文件不在“rootDir”下。“rootDir”应包含所有源文件
- sql-server - 如何用斜杠插入日期类型
- javascript - 图表 JS:在 Y 轴上设置刻度之间的间距
- google-apps-script - 将日期写入 Google 表格时出现奇怪的不一致
- python - 如何从 view.py 文件中的 FORM 获取单选按钮值