2010-08-18 10 views
3

Je suis en train de développer une application web Tomcat et j'ai besoin de pouvoir redémarrer Tomcat pour charger les changements de code. Cependant, parfois Tomcat prend beaucoup de temps au démarrage comme le thread principal est bloqué à l'endroit suivant:Comment accélérer Tomcat SSL init

java.lang.Thread.State: RUNNABLE 
    at org.apache.tomcat.jni.SSL.initialize(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.catalina.core.AprLifecycleListener.initializeSSL(AprLifecycleListener.java:214) 
- locked <119e583> (a java.lang.Class) 
at org.apache.catalina.core.AprLifecycleListener.lifecycleEvent(AprLifecycleListener.java:83) 
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) 
at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:770) 
at org.apache.catalina.startup.Catalina.load(Catalina.java:530) 
at org.apache.catalina.startup.Catalina.load(Catalina.java:550) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:260) 
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:412) 

Ce décrochage est causée par l'entropie disponible (comme indiqué en exécutant cat/proc/sys/kernel/random/entropy_avail) est trop bas.

Quand je suis du développement de code, je ne se soucient pas si le moteur SSL est initialisée avec un bon nombre aléatoire.

Est-il possible pour moi de vider une entropie faux dans/dev/rnd ou Tomcat forcer à utiliser une entropie faux?

Je peux pousser l'entropie plus rapidement en exécutant « trouver/» mais cela prend un certain temps pour produire l'entropie suffisante.

Répondre

2

Réglage de l'environnement RANDFILE variable "/ dev/urandom" fait utiliser Tomcat cette source pour SSL d'initialisation.

+0

Eh bien, c'était OpenSSL alors - http://www.openssl.org/support/faq.cgi#USER1. J'ai bien peur de ne pas avoir vu l'appel JNI dans la stacktrace qui contenait aussi des références à AprLifecycleListener. Mais cela explique pourquoi la configuration de java.security.egd n'a pas fonctionné. Tomcat utilisait APR qui utilise OpenSSL et non JSSE. –

3

Vous pouvez utiliser /dev/urandom in a development environment, car il est plus rapide (et évidemment moins sûr) que/dev/random.

Remarque - Cela ne fonctionne pas sous Windows, et j'attendre qu'il ne soit pas nécessaire sur Windows que le problème ne se manifeste que par l'utilisation de/dev/random. Windows utilise Microsoft Crypto API (CAPI) lorsque la chaîne/dev/random est utilisée pour indiquer la source PRNG requise (c'est-à-dire la propriété securerandom.source dans le fichier JRE_HOME/lib/security/java.security).

EDIT

Sur la base de l'autre réponse qui nécessite le réglage de la variable d'environnement RANDFILE, la solution décrite ici est applicable lorsque la non-native (à savoir JSSE) est utilisé pour la mise en œuvre SSL dans Tomcat.

+0

Mon instance Tomcat s'exécute sous Linux. L'ajout de -Djava.security.egd = fichier:/dev /./ urandom à ma liste d'args de ligne de commande semble n'avoir aucun effet - le démarrage est toujours très lent lorsque le pool d'entropie est bas. J'utilise Java HotSpot (TM) Server VM (build 10.0-b23, mode mixte). Y a-t-il une raison pour laquelle une substitution de ligne de commande de cette propriété serait ignorée par Java? En particulier, mon fichier java.security contient la ligne securerandom.source = file:/dev/urandom. L'option de ligne de commande peut-elle remplacer cela? – mchr

+0

Paramètre securerandom.source = fichier:/dev /./ urandom dans java.security semble toujours n'avoir aucun effet sur les heures de démarrage. Peut-être que tomcat.jni.SSL.initialize est codé en dur pour utiliser/dev/random? – mchr

+0

@mchr, pouvez-vous essayer d'exécuter les commandes suivantes pour vérifier que urandom est en effet plus rapide que aléatoire sur votre installation: 1) cat/dev/random 2) cat/dev/urandom. Sur un exemple VMWare de test, où aléatoire est censé être plus lent que urandom, je peux voir un changement notable dans la vitesse. Cela devrait être plus ou moins la même chose pour vous. –