Liberty tls java.net.http.websocket не удастся после перехода на Java 21 & JakartaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Liberty tls java.net.http.websocket не удастся после перехода на Java 21 & Jakarta

Сообщение Anonymous »

У нас есть код java.net.http.websocket , который подключается к нашим устройствам с протоколом веб -сокетов WSS: // TLS -протокола Web Socket успешно под нашим открытым java 17, Java EE (и Spring 5), но терпит неудачу под Java 21, Jakarta EE (и Spring 6).

Код: Выделить всё

server.xml
имеет конфигурацию SSL по умолчанию, которая указывает на трастовый магазин, в котором используется пользовательский сертификат подписавшегося, которые используют эти устройства. В конфигурации SSL также отключена проверка имени хоста TLS, потому что некоторые внутренние сертификаты, которые, по-видимому, кажутся неуместными в отношении того, какое имя они присутствуют, несмотря на все наши лучшие усилия по решению этого.

Код: Выделить всё



< /code>
Функции Liberty вышли из: < /pbr /> 

concurrent-1.0
webProfile-8.0
javaMail-1.6
mpHealth-4.0

< /code>
to: < /p>

concurrent-3.0
webProfile-10.0
mail-2.1
mpHealth-4.0

< /code>
Те же версии OpenLiberty (последние, в настоящее время 25.0.0.9). < /p>
Тот же код WebSocke, который работает под старой версией приложения: < /p>
webSocket = HttpClient.newHttpClient().newWebSocketBuilder()
.connectTimeout(Duration.ofSeconds(5))
.buildAsync(URI.create(endpoint), this)
.get();
< /code>
Результаты ошибки цепочки сертификатов в рамках новой версии: < /p>

21: 15: 01,510 ошибка com.ibm.gs.houston.payment.pos.ingenico.usi.usiposprovider: startpayment [default rexor-justor-hreadthrehdh OrderNumber = 2025092504, DeviceId = 9995: java.util.concurrent.executionException: javax.net.ssl.sslhandshakeexception: Pkix Path Build javax.net.ssl.sslhandshakeexception: Pkix Path Building Fake: sun.security.provider.certpath.suncertpathbuilderexception: Невозможно найти действительный путь сертификации для запрошенной цели

нет более дополнительной информации с JVM или Liberty SSL -DELUG/TRACE/PRACE. Похоже, Java.net.http.websocket 
больше не использует конфигурацию SSL по умолчанию в рамках Liberty. Когда я изменяю код Java, чтобы явно ссылаться на Liberty "Defaultslconfiguration" SSLContext, я преодолею эту ошибку: < /p>

Код: Выделить всё

webSocket = HttpClient.newBuilder().sslContext(sslContext).build().newWebSocketBuilder()
.connectTimeout(Duration.ofSeconds(5))
.buildAsync(URI.create(endpoint), this)
.get();
где sslcontext был введен как

Код: Выделить всё

com.ibm.websphere.ssl.JSSEHelper.getInstance().getSSLContext("defaultSSLConfig", null, null);
< /code>
Но теперь я получаю ошибку < /p>
javax.net.ssl.SSLHandshakeException: No name matching  found
Несмотря на то, что вы можете видеть выше, имея указанный verifyhostname = "false" в этом элементе . Кроме того, если я переопределяю это поведение на уровне JVM с -Дждк.internal.httpclient.disablehostnameverification = true , подключение к веб -сокетам полностью работает. Что говорит мне о том, что даже когда я явно ссылаюсь на «defaultslconfig», не используются не все его настройки.
(у нас также есть действительный сертификат диких знаков, но это отдельная тема.) Есть ли лучший, рекомендуемый способ получить необходимое поведение, которое мне нужно, где я указал свободу в хранилище доверия, который содержит необходимые сертификаты для этого веб -общения? (SSL-1.0) Функция включена, вы получаете класс SSLContext Liberty по умолчанию с помощью метода sslContext.getDefault (). Однако, когда функция безопасности транспортной безопасности включена, метод sslContext.getDefault () возвращает класс SSLContext Java Secure Socket Extension (JSSE). Поэтому изменение из одной функции на другую может потребовать от вас обновления кода приложения. Чтобы получить класс Liberty SSLContext, когда включена функция безопасности транспортной безопасности, используйте метод jsseHelper.getInstance (). getSslContext (NULL, NULL, NULL) вместо метода SSLCONTEXT.GETDEFAUL "Defaultsslconfig": < /p>

Код: Выделить всё

com.ibm.websphere.ssl.JSSEHelper.getInstance().getSSLContext(null, null, null);
, который включает в себя все еще не честь VerifyHostName = "false" . «Defaultslconfiguration» в любом случае. Я поступил дальше и попытался явно указывать на это на эту конфигурацию, но неудивительно, что исходная проблема остается. 2
и, просматривая код с отладчиком, свойства экземпляра sslcontext do содержит переопределение имени хоста. Из типа реализации libertysslcontext.contextspi.delegate.contextspi.trustmanager.config :

Код: Выделить всё

...
com.ibm.ssl.alias=defaultSSLConfig
com.ibm.ssl.trustStoreName=defaultTrustStore
com.ibm.ws.ssl.verifyHostname=false
...
Я не знаю, если проблема заключается в том, что это свойство находится на уровне ws.ssl , а не на уровне ssl .
Я вводил объект конфигурации/свойства и пытался вручную добавить некоторые связанные свойства, и это тоже не имеет различия. Я полагаю, что неудивительно, как они задокументированы под «традиционной веб -мастер», а не свободы.

Подробнее здесь: https://stackoverflow.com/questions/797 ... 21-jakarta
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»