Используя API HttpBuilder в Java 11, где вы указываете hostNameVerifier?

Мы перемещаем службу с JDK 10.0.1 на JDK 11. Эта служба взаимодействует с использованием соединения TLS, где сервер имеет самозаверяющий сертификат.

ЦС этого сертификата добавлен в cacerts обеих JVM.

При использовании JDK 10 этого было достаточно, чтобы иметь возможность использовать HttpBuilder API и взаимодействовать с этой службой. При запуске того же кода (только с изменениями для перехода с jdk.incubator.http на java.net.http) на JDK 11 я столкнулся с пресловутой ошибкой «java.security.cert.CertificateException: нет альтернативных имен субъектов»?

Я понимаю, что это легко исправить, создав HostNameVerifier с пользовательской реализацией, которая затем используется с HttpsUrlConnection.

Но я бы предпочел использовать HttpBuilder API, если это возможно.


person Jürgen De Commer    schedule 17.10.2018    source источник
comment
Было преднамеренным решением не добавлять API проверки имени хоста в HTTP-клиент Java 11. Строгая проверка имени хоста включена по умолчанию (и может быть отключена глобально в некоторых средах, например при тестировании). Могу ли я спросить, каков вариант использования для подключения к защищенному серверу, который не идентифицирует себя в своем сертификате. Может у вас есть пример такого сервера/сервиса?   -  person chegar999    schedule 31.10.2018
comment
@ chegar999 у нас есть настройка, в которой машины общаются друг с другом в частной сети и используют взаимный ssl для безопасного доступа к службам. Все внутренние сертификаты генерируются с использованием одного и того же (собственного) ЦС. (Мы используем соответствующие сертификаты для общедоступных конечных точек, не беспокойтесь). В этом случае имеется новый Java-клиент, которому необходимо подключиться к одной из этих служб через петлевой интерфейс. И было удивительно внезапно изменить поведение при переходе с JDK 10 на 11. В будущем мы рассмотрим возможность изменения нашего создания сертификата и добавим необходимую информацию, чтобы избежать установки флага.   -  person Jürgen De Commer    schedule 08.11.2018


Ответы (1)


Существует системное свойство с метким названием «jdk.internal.httpclient.disableHostnameVerification», которое можно использовать для отключения проверки: http://hg.openjdk.java.net/jdk/jdk/file/4254bed3c09d/src/java.net.http/share/classes/jdk/internal/net/http/common/Utils.java#l110

Моя проблема решена, когда я запускаю свою службу как таковую:

java -Djdk.internal.httpclient.disableHostnameVerification -jar FancyService.jar
person Jürgen De Commer    schedule 18.10.2018