Trustmanager не используется, когда приложение упаковано - PullRequest
2 голосов
/ 07 августа 2020

Это сводит меня с ума: у меня есть небольшое модульное приложение 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 \, в которой он работает. Тем не менее, это не очень помогает, так как я не знаю, откуда взялся этот файл модулей и почему тот, который поставляется с упакованной средой выполнения, больше, чем тот, который находится в моей общесистемной установке, но, возможно, у кого-то есть идея.

1 Ответ

2 голосов
/ 07 августа 2020

Эта проблема помогла мне с этой проблемой: https://bugs.openjdk.java.net/browse/JDK-8221674

По сути, оказалось, что отсутствуют некоторые модули, например jdk.crypto.e c или какой-то модуль имеет дело с JSON сериализацией / десериализацией. Я добавил "--bind-services" в параметры jlink, и похоже, что он работает.

...