【发布时间】:2020-08-07 06:18:46
【问题描述】:
这让我抓狂:我有一个运行 Java 14 的小型模块化 JavaFX (TornadoFX) 应用程序。在为模块系统工作而费尽心思之后(感谢 Badass JLink 插件 (https://badass-jlink-plugin.beryx.org/releases/latest/))我m 现在试图为它获取一个独立的可执行文件。该插件使用 jpackager 生成可执行文件并运行,但它不会使用(自定义)信任管理器进行 SSL 连接。
我有带有一些证书的小型自定义信任库文件。这会在启动时加载到密钥库中,然后用于创建自定义 TrustManager 实例。然后将自定义的 TrustManager 和默认的 TrustManager 合并为一个 TrustManager,后者首先尝试使用自定义的 TrustManager 验证证书,如果失败,则使用默认的再次尝试。
这在从 IDE 运行应用程序时可以正常工作(gradle run)。该应用程序使用 WebView 来显示远程登录页面,我可以在日志中看到 TrustManager 用于验证证书。在此之后,对某个端点进行 Rest 调用,并再次调用 trustmanager 来检查证书。
但是,当我使用 jpackager 打包应用程序时,这不起作用。现在,由于某种不明原因,信任管理器仅用于 WebView 建立的连接,而不用于 Rest 调用。
我已经比较了打包运行时和 IDE 中使用的安全权限/策略,没有区别。
我对 Java 感到非常沮丧。首先是模块系统的痛苦,现在是这个。我完全不知道可能是什么问题。
这里有一些日志。先是打包后的版本:
08:27:11.202 [INFO ] [JavaFX Application Thread] com.bmw.swhrl.dm.ui.view.LoginView - Location: https://somewebsite.org
08:27:11.400 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - Chain
08:27:11.401 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - CN=<cert>
08:27:11.401 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - CN=<cert>
08:27:11.402 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - Stored
08:27:11.402 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - CN=<stored cert>
08:27:11.403 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - CN=<stored cert>
08:27:11.403 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - CN=<stored cert>
08:27:11.450 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - Accepted issuers
08:27:11.680 [INFO ] [JavaFX Application Thread] com.bmw.swhrl.dm.ui.view.LoginView - Location: http://localhost:8080/...
08:27:12.296 [INFO ] [tornadofx-thread-1] c.b.s.dm.ui.viewmodel.MainViewModel - Request: https://somewebsite/webapi/config
08:27:13.940 [INFO ] [tornadofx-thread-1] c.b.s.dm.ui.viewmodel.MainViewModel - Request: https://somewebsite/webapi/config
08:27:14.817 [INFO ] [tornadofx-thread-1] c.b.s.dm.ui.viewmodel.MainViewModel - Request: https://somewebsite/webapi/config
在 Rest 调用期间没有调用 trustmanager。
现在版本从 IDE 启动:
08:30:24.413 [INFO ] [JavaFX Application Thread] com.bmw.swhrl.dm.ui.view.LoginView - Location: https://somewebsite.org
08:30:24.582 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - Chain
08:30:24.583 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - CN=<cert>
08:30:24.583 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - CN=<cert>
08:30:24.584 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - Stored
08:30:24.585 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - CN=<stored cert>
08:30:24.586 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - CN=<stored cert>
08:30:24.643 [INFO ] [URL-Loader-1] com.bmw.swhrl.dm.util.TrustManager - Accepted issuers
08:30:24.936 [INFO ] [JavaFX Application Thread] com.bmw.swhrl.dm.ui.view.LoginView - Location: http://localhost:8080/...
08:30:25.610 [INFO ] [tornadofx-thread-1] c.b.s.dm.ui.viewmodel.MainViewModel - Request: https://somewebsite/webapi/config
08:30:25.731 [INFO ] [tornadofx-thread-1] com.bmw.swhrl.dm.util.TrustManager - Chain
08:30:25.731 [INFO ] [tornadofx-thread-1] com.bmw.swhrl.dm.util.TrustManager - CN=<cert>
08:30:25.731 [INFO ] [tornadofx-thread-1] com.bmw.swhrl.dm.util.TrustManager - CN=<cert>
08:30:25.731 [INFO ] [tornadofx-thread-1] com.bmw.swhrl.dm.util.TrustManager - Stored
08:30:25.731 [INFO ] [tornadofx-thread-1] com.bmw.swhrl.dm.util.TrustManager - CN=<stored cert>
08:30:25.731 [INFO ] [tornadofx-thread-1] com.bmw.swhrl.dm.util.TrustManager - CN=<stored cert>
08:30:25.731 [INFO ] [tornadofx-thread-1] com.bmw.swhrl.dm.util.TrustManager - CN=<stored cert>
08:30:25.732 [INFO ] [tornadofx-thread-1] com.bmw.swhrl.dm.util.TrustManager - Accepted issuers
这里还为 Rest 调用调用 trustmanager 并建立连接。
编辑: 我现在尝试将打包的运行时与我系统上安装的运行时进行比较,我发现如果我将文件 C:\Program Files\Java\jdk-14\lib\modules 复制到打包的运行时 lib\文件夹它正在工作。这仍然没有多大帮助,因为我不知道这个模块文件来自哪里以及为什么打包运行时附带的那个比我在系统范围安装中找到的那个大,但也许有人有一个想法。
【问题讨论】: