2

这让我抓狂:我有一个运行 Java 14 的小型模块化 JavaFX (TornadoFX) 应用程序。在让模块系统工作时遇到了很多麻烦(感谢 Badass JLink 插件(https://badass-jlink-plugin)。 beryx.org/releases/latest/ )) 我现在正在尝试为它获取一个独立的可执行文件。该插件使用 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\ 文件夹它正在工作。这仍然没有多大帮助,因为我不知道这个模块文件来自哪里以及为什么打包运行时附带的那个比我在系统范围安装中找到的那个大,但也许有人有一个想法。

4

1 回答 1

3

这个问题帮助我解决了这个问题:https ://bugs.openjdk.java.net/browse/JDK-8221674

基本上,事实证明缺少一些模块,例如 jdk.crypto.ec 或一些处理 JSON 序列化/反序列化的模块。我现在在 jlink 选项中添加了“--bind-services”,看起来它正在工作。

于 2020-08-07T16:25:18.693 回答