Как выполнить проверку имени хоста в Java для пользовательских протоколов?

Мы используем собственный протокол через сокеты. С TLS мы не можем использовать setEndpointIdentificationAlgorithm(), поскольку его аргументы могут быть HTTPS или LDAPS.

Как выполнить проверку имени хоста в случае пользовательских протоколов? Нужно ли нам использовать класс HostnameVerifier, переопределяя метод verify()? Если да, то как мы можем получить имя хоста из URL-адреса специального протокола?

С пользовательским протоколом вы предоставлены сами себе. Проверка имени хоста AFAIK не встроена в TLS как таковую, но поставляется с протоколами более высокого уровня. Если у вас есть собственный протокол и он его не поддерживает, вам придется обойтись без него или добавить его. Однако вы сможете получить много вдохновения от HTTP.

ewramner 29.04.2024 19:23

Должно быть возможно получить конечный сертификат, и тогда вы сможете получить доступ к правильным элементам. Проблема в том, что я забыл, как это сделать на Java:/

Maarten Bodewes 30.04.2024 00:03

Я вижу два «близких голосования», вероятно, от людей, которые не понимают вопроса. Если чего-то не хватает, пожалуйста, прокомментируйте.

Maarten Bodewes 30.04.2024 14:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы используете собственный базовый протокол, отличный от HTTP, я думаю, в конечном итоге вы устанавливаете соединение javax.net.ssl.SSLSocket. SSLSocket имеет getSSLSession() , который дает вам SSLSession, к которому можно запросить различные сведения о соединении SSL/TLS.

Кроме того, SSLSession — это именно то, что HostnameVerifer необходимо для проверки хоста. Таким образом, вы сможете использовать HttpsURLConnection.getDefaultHostnameVerifier(), чтобы получить экземпляр верификатора по умолчанию, и использовать его для проверки, соответствует ли имя хоста, которое вы использовали для установления соединения, сертификату сервера.

Поэтому после установления соединения SSLSocket должна быть возможность проверить имя хоста таким образом (код не проверялся):

String hostname = "example.org";
SSLSocket socket = ... // establish SSLSocket to <hostname>

HostnameVerifier verifier = HttpsURLConnection.getDefaultHostnameVerifier();
verifier.verify(hostname, socket.getSession());

Другие вопросы по теме