2010-07-07 2 views
7

J'ai un serveur en développement et quelques développeurs s'y connectent. Ce serveur utilise l'implémentation TLS de Java avec SSLEngine.Comment désactiver la recherche DNS inverse SSL de Java

Nous avons vu que, dans un premier temps, chaque nouvelle connexion aurait un long délai (30-40 secondes). Nous l'avons réduit pour inverser les recherches DNS. Nous avons résolu cela en mettant toutes nos adresses IP dans le fichier HOSTS.

Maintenant, le problème est que nous allons élargir progressivement notre base d'utilisateurs et je ne veux pas éditer le fichier HOSTS, d'autant plus que nous ne pouvons pas garantir qu'ils auront des adresses IP statiques.

Est-il possible de désactiver l'étape de recherche DNS inverse dans SSL/TLS de Java?

Je voudrais avoir ceci comme un paramètre configurable, de sorte que nous puissions l'éteindre pendant le développement.

+0

Quel serveur d'applications utilisez-vous? Oracle WebLogic Server utilise Certicom et non l'implémentation Sun JSSE, les mécanismes de configuration varient donc. –

Répondre

3

Cette question a été soulevée en 2006 sur le Sun JSSE forums. La ligne de fond est qu'il semble se produire uniquement dans le runtime de Windows java. Dans this bug report, vers le bas, est une solution proposée. Et voici another proposed solution:

Fondamentalement, une recherche DNS inversée lors de la négociation SSL provoque un long délai d'attente .

Pour résoudre le problème, mettez en cache l'adresse de votre serveur en tant qu'objet InetAddress et réutilisez-le dans le constructeur Socket chaque fois que vous créez une nouvelle connexion avec votre serveur.

Espérons que l'un d'entre eux fonctionnera pour vous.

+0

que voulez-vous dire par cache? comment pouvons-nous y parvenir? – Farhan

11

J'ai fait face à ce même problème aujourd'hui lorsque j'ai essayé de créer une connexion de socket SSL par adresse IP uniquement. Cela a abouti à la tentative de recherche DNS inverse, et donc il était vraiment lent ...

Pour moi, la solution était simplement de passer une chaîne vide fictive comme nom d'hôte, lors de la création de l'InetAddress pour la connexion SSL. C'est, je l'ai changé

InetAddress.getByAddress(addrBytes) 

à

InetAddress.getByAddress("", addrBytes) 

et il ne fait plus la recherche DNS inversée.

0

La solution d'Ari de passer un nom d'hôte vide au InetAddress a fonctionné pour se connecter à un seul hôte, mais cela a eu des effets secondaires lors de la connexion à plusieurs hôtes par adresse IP. Java met en cache l'objet SSLSession à l'aide du tuple <remote-hostname, port>. Cela peut être vu dans le OpenJDK here. Ainsi, les paramètres TLS pour une connexion précédente (en particulier la version de protocole TLS dans mon cas), ont été appliqués à une nouvelle connexion à un hôte différent (puisque les deux partageaient le même nom d'hôte vide). Dans mon cas, le nouvel hôte a rejeté le protocole TLS v1 dégradé négocié par l'hôte précédent, ce qui a provoqué des erreurs de prise de contact TLS.

La solution a été de construire un nom d'hôte unique basé sur l'adresse IP à distance au lieu comme ceci:

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

Ainsi les exécute Java de recherche DNS inversée a été désactivé, mais les paramètres TLS mises en cache des hôtes distants ont été appliquées uniquement à le même hôte et port distant sans l'effet de diaphonie.