Решение 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 для удаленных хостов были применены только к тому же удаленному хосту и порту без эффекта перекрестных помех.