2010-07-07 25 views
7

Ho un server in sviluppo e alcuni sviluppatori che si connettono ad esso. Questo server utilizza l'implementazione TLS di Java con SSLEngine.Come disabilitare la ricerca DNS inversa DNS di Java

Abbiamo visto che, all'inizio, ogni nuova connessione avrebbe avuto un lungo ritardo (30-40 secondi). Lo abbiamo ristretto per invertire il timeout delle ricerche DNS. Abbiamo risolto questo problema inserendo tutti i nostri IP nel file HOSTS.

Ora, il problema è che estenderemo progressivamente la nostra base di utenti e non voglio modificare il file HOSTS, soprattutto perché non possiamo garantire che abbiano IP statici.

C'è un modo per disattivare il passaggio di ricerca DNS inverso in SSL/TLS di Java?

Mi piacerebbe avere questo come parametro configurabile, in modo che possiamo spegnerlo durante lo sviluppo.

+0

Quale server applicazioni stai utilizzando? Oracle WebLogic Server utilizza Certicom e non l'implementazione JSSE di Sun, quindi i meccanismi di configurazione variano. –

risposta

3

Questa domanda è arrivata nel 2006 sul Sun JSSE forums. La linea di fondo è che sembra verificarsi solo nel runtime di Java di Windows. In this bug report, verso il basso, è una soluzione proposta. E qui è another proposed solution:

In sostanza, una ricerca DNS inversa durante l'handshake SSL provoca una lunga timeout.

Per risolvere il problema, inserire nella cache l'indirizzo del server come oggetto InetAddress e riutilizzarlo nel costruttore Socket ogni volta che si effettua una nuova connessione al server.

Speriamo che uno di questi funzioni per voi.

+0

cosa intendi per cache? come possiamo accettarlo? – Farhan

11

Ho affrontato questo stesso problema oggi quando ho provato a creare una connessione socket SSL solo per indirizzo IP. Ciò ha comportato un tentativo di ricerca DNS inverso e quindi è stato molto lento ...

Per me la soluzione era semplicemente passare una stringa vuota fittizia come nome host, quando si creava InetAddress per la connessione SSL. Cioè, ho cambiato

InetAddress.getByAddress(addrBytes) 

a

InetAddress.getByAddress("", addrBytes) 

e lo fa non è più la ricerca DNS inversa.

0

La soluzione di Ari di passare un nome host vuoto su InetAddress ha funzionato per la connessione a un singolo host, ma ha avuto alcuni effetti collaterali durante la connessione a più host tramite l'indirizzo IP. Java memorizza nella cache l'oggetto SSLSession utilizzando la tupla <remote-hostname, port>. Questo può essere visto in OpenJDK here. Pertanto, le impostazioni TLS per una connessione precedente (in particolare la versione del protocollo TLS nel mio caso), sono state applicate a una nuova connessione a un host diverso (poiché entrambi hanno condiviso lo stesso hostname vuoto). Nel mio caso, il nuovo host ha rifiutato il protocollo TLS v1 downgrade negoziato dall'host precedente, causando errori di handshake TLS.

La soluzione era di costruire un hostname unico in base all'indirizzo IP remoto invece in questo modo:

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

Così le esegue Java di ricerca DNS inversa è stato disattivato, ma le impostazioni TLS nella cache per gli host remoti sono stati applicati solo alle lo stesso host remoto e la stessa porta senza l'effetto crosstalk.