2010-07-07 22 views
7

Tengo un servidor en desarrollo y algunos desarrolladores que se conectan a él. Este servidor utiliza la implementación de TLS de Java con SSLEngine.Cómo deshabilitar la búsqueda DNS DNS inversa de Java

Vimos que, al principio, cada nueva conexión tendría una gran demora (30-40 segundos). Lo reducimos para revertir el tiempo de espera de las búsquedas de DNS. Lo solucionamos poniendo todas nuestras direcciones IP en el archivo HOSTS.

Ahora, el problema es que vamos a ampliar progresivamente nuestra base de usuarios y no quiero editar el archivo HOSTS, especialmente porque no podemos garantizar que vayan a tener direcciones IP estáticas.

¿Hay alguna forma de deshabilitar el paso de búsqueda DNS inversa en SSL/TLS de Java?

Me gustaría tener esto como un parámetro configurable, para que podamos desactivarlo durante el desarrollo.

+0

¿Qué servidor de aplicaciones está utilizando? Oracle WebLogic Server utiliza Certicom y no la implementación Sun JSSE, por lo que los mecanismos de configuración varían. –

Respuesta

3

Esta pregunta surgió en 2006 en el Sun JSSE forums. La conclusión es que parece ocurrir solo en el tiempo de ejecución de Windows java. En this bug report, hacia abajo, hay una solución propuesta. Y aquí es another proposed solution:

Básicamente, una búsqueda DNS inversa durante el protocolo de enlace SSL hace un largo tiempo de espera .

Para solucionar el problema, la memoria caché la dirección del servidor como un objeto InetAddress y reutilizarla en el constructor Socket cada vez que usted está haciendo una nueva conexión a su servidor.

Esperemos que uno de estos funcione para usted.

+0

¿qué quieres decir con caché? ¿Cómo podemos lograr eso? – Farhan

11

Hoy enfrenté este mismo problema cuando traté de crear una conexión de socket SSL solo por dirección IP. Eso dio como resultado un intento de búsqueda de DNS inverso, y por lo tanto fue realmente lento ...

Para mí, la solución fue simplemente pasar una cadena falsa vacía como nombre de host, al crear InetAddress para la conexión SSL. Es decir, he cambiado

InetAddress.getByAddress(addrBytes) 

a

InetAddress.getByAddress("", addrBytes) 

y ya no lo hace la búsqueda de DNS inversa.

0

La solución de Ari de pasar un nombre de host vacío al InetAddress funcionó para conectarse a un solo host, pero tuvo algunos efectos secundarios cuando se conectó a varios hosts por dirección IP. Java almacena en caché el objeto SSLSession utilizando la tupla <remote-hostname, port>. Esto se puede ver en OpenJDK here. Por lo tanto, las configuraciones TLS para una conexión previa (específicamente la versión del protocolo TLS en mi caso) se aplicaron a una nueva conexión a un host diferente (ya que ambas compartían el mismo nombre de host vacío). En mi caso, el nuevo host rechazó el protocolo TLS v1 degradado negociado por el host anterior, lo que provocó errores de handshake de TLS.

La solución fue construir un nombre de host único basado en la dirección IP remota en lugar de este modo:

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

Así, los realiza Java de búsqueda de DNS inversa fue desactivado, pero TLS en caché a los hosts remotos solamente se aplicaron a el mismo host remoto y puerto sin el efecto de diafonía.

Cuestiones relacionadas