Как отключить Java Обратный поиск DNS - PullRequest
7 голосов
/ 07 июля 2010

У меня есть сервер в разработке и несколько разработчиков подключаются к нему. Этот сервер использует реализацию TLS Java с SSLEngine.

Мы видели, что сначала каждое новое соединение будет иметь большую задержку (30-40 секунд). Мы сократили время ожидания поиска DNS. Мы решили это, поместив все наши IP-адреса в файл HOSTS.

Теперь проблема в том, что мы будем постепенно расширять нашу пользовательскую базу, и я не хочу редактировать файл HOSTS, тем более что мы не можем гарантировать, что у них будут статические IP-адреса.

Есть ли способ отключить шаг обратного просмотра DNS в SSL / TLS Java?

Я бы хотел, чтобы это было настраиваемым параметром, чтобы мы могли отключить его во время разработки.

Ответы [ 3 ]

11 голосов
/ 25 октября 2012

Я столкнулся с этой же проблемой сегодня, когда пытался создать сокет-соединение SSL только по IP-адресу.Это привело к попытке обратного просмотра DNS, и поэтому это было очень медленно ...

Для меня решение было просто передать пустую пустую строку в качестве имени хоста при создании InetAddress для соединения SSL.То есть я изменил

InetAddress.getByAddress(addrBytes)

на

InetAddress.getByAddress("", addrBytes)

, и он больше не выполняет обратный поиск DNS.

3 голосов
/ 07 июля 2010

Этот вопрос возник в 2006 году на форумах Sun JSSE .Суть в том, что, похоже, это происходит только во время выполнения Windows Java.В этот отчет об ошибке , внизу, является одним из предложенных решений.А вот еще одно предлагаемое решение :

По сути, обратный поиск DNS во время SSL-рукопожатия приводит к длительному тайм-ауту.адрес сервера как объект InetAddress и повторно использовать его в конструкторе Socket всякий раз, когда вы устанавливаете новое соединение с вашим сервером.

Надеемся, что один из них будет работать для вас.

0 голосов
/ 15 октября 2016

Решение Ari передать пустое имя хоста InetAddress работало для подключения к одному хосту, но у него были некоторые побочные эффекты при подключении к нескольким хостам по IP-адресу.Java кэширует объект SSLSession, используя кортеж <remote-hostname, port>.Это можно увидеть в OpenJDK здесь .Таким образом, настройки TLS для предыдущего соединения (в частности, версии протокола TLS в моем случае) были применены к новому соединению с другим хостом (так как оба имели одно и то же пустое имя хоста).В моем случае новый хост отклонил устаревший протокол TLS v1, согласованный предыдущим хостом, что привело к ошибкам рукопожатия TLS.

Решением было вместо этого создать уникальное имя хоста на основе удаленного IP-адреса, например:

String hostname = String.format("host-%s", BaseEncoding.base16().encode(address.getAddress()));
InetAddress newAddress = InetAddress.getByAddress(hostname, address.getAddress());

Таким образом, обратный поиск DNS, выполняемый Java, был отключен, но кэшированные настройки TLS для удаленных хостов были применены только к тому же удаленному хосту и порту без эффекта перекрестных помех.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...