Это сводит меня с ума: у меня есть небольшое модульное приложение JavaFX (TornadoFX), работающее с Java 14. После многих головных болей заставить работать модульную систему (спасибо Badass JLink Plugin (* 1002) *)) Сейчас я пытаюсь получить для него автономный исполняемый файл. Плагин использует jpackager для создания исполняемого файла, и он запускается, но он не будет использовать (настраиваемый) диспетчер доверия для соединений SSL.
У меня есть небольшой настраиваемый файл хранилища доверенных сертификатов с некоторыми сертификатами. Он загружается в хранилище ключей при запуске, которое, в свою очередь, используется для создания настраиваемого экземпляра TrustManager. И настраиваемый TrustManager, и настраиваемый по умолчанию затем объединяются в один TrustManager, который сначала пытается проверить сертификат с помощью настраиваемого TrustManager и, если это не удается, пытается снова с помощью стандартного.
Это отлично работает, когда запуск приложения из IDE (запуск Gradle). Приложение использует 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.
Теперь версия запускается из 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, и соединение устанавливается.
EDIT: теперь я попытался сравнить упакованную среду выполнения с той, которая установлена в моей системе, и я обнаружил, что если я скопирую файл C: \ Program Files \ Java \ jdk-14 \ lib \ modules в папку упакованных сред выполнения lib \, в которой он работает. Тем не менее, это не очень помогает, так как я не знаю, откуда взялся этот файл модулей и почему тот, который поставляется с упакованной средой выполнения, больше, чем тот, который находится в моей общесистемной установке, но, возможно, у кого-то есть идея.