Медленный запуск на Tomcat 7.0.57 из-за SecureRandom
Я использую Tomcat 7.0.57 на CentOS 6.6 32 бит и openJDK7.
Когда я запускаю 14 различных экземпляров Tomcat на моем сервере (производственная среда), многие из них занимают слишком много времени, чтобы начать.
Это часть журнала запуска, в котором говорится, где все время занимает
Jan 28, 2015 2:49:41 PM org.apache.catalina.util.SessionIdGenerator createSecureRandom
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [199,620] milliseconds.
Какая наилучшая практика/решение этой проблемы?
Спасибо!
Ответы
Ответ 1
Защищенные случайные вызовы могут блокироваться, поскольку энтропии недостаточно для их передачи в /dev/random.
Если у вас есть строка
securerandom.source=file:/dev/random
в/jre/lib/security/java.security, изменение этого на urandom может улучшить ситуацию (хотя это, вероятно, уже по умолчанию).
В качестве альтернативы есть несколько предложений о том, как подать пул здесь.
https://security.stackexchange.com/questions/89/feeding-dev-random-entropy-pool
Ответ 2
Я столкнулся с той же проблемой, что tomcat слишком медленный, чтобы начать. Я следовал этой статье о DigitalOcean и установил hasged вместо использования urandom.
Это решение, которое не пойдет на компромисс в отношении безопасности.
hasged позволяет генерировать случайность в зависимости от времени выполнения кода на процессоре. Поскольку для одного куска кода практически невозможно выполнить одно и то же точное время, даже в одной и той же среде на одном и том же оборудовании, время запуска одной или нескольких программ должно быть подходящим для заполнения случайного источника. Реализация с хеджированием приводит к тому, что ваш системный случайный источник (обычно /dev/random) использует различия в счетчике меток времени вашего процессора (TSC) после повторного выполнения цикла
Как установить hasged
Следуйте инструкциям в этой статье. https://www.digitalocean.com/community/tutorials/how-to-setup-additional-entropy-for-cloud-servers-using-haveged
Я разместил это здесь
Ответ 3
Вот некоторые конкретные инструкции по настройке только tomcat в соответствии с ответом Генри.
создать /etc/tomcat/fastersecurerandom.properties
securerandom.source=file:/dev/urandom
edit JAVA_OPTS
внутри /etc/tomcat/tomcat.conf
JAVA_OPTS="-Djava.security.properties=/etc/tomcat/fastersecurerandom.properties"
FYI Я обнаружил, что не смог установить несколько JAVA_OPTS
с JAVA_OPTS="$JAVA_OPTS ..."
, несмотря на приведенные примеры. Бедный старый запутанный кот 7 не запускался бы в соответствии с предупреждением в /var/log/messages
В разных версиях/вариантах вы можете найти варианты, где лучше всего устанавливать переменные среды для tomcat. Лучшим способом отладки, если они влияют, является проверка команды, выполняющейся следующим образом:
$ ps aux | grep java
tomcat 4821 4.7 13.9 2626888 263396 ? Ssl 22:31 0:23 /usr/lib/jvm/jre/bin/java -DJENKINS_HOME=/opt/jenkins/ -Xmx512m -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Djava.security.properties=/etc/tomcat/fastersecurerandom.properties -classpath /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat -Dcatalina.home=/usr/share/tomcat -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat/temp -Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
Ответ 4
Я изменил /jre/lib/security/java.security, ниже:
securerandom.source = файл:/DEV/./urandom
Ответ 5
Ответ @KCD выше почти сработал для меня, мне нужно было немного помассировать его:
1) мой tomcat был tomcat7
, поэтому я создал свой файл fastersecurerandom.properties
каталоге /etc/tomcat7
,
2) Как и на другой странице, мне пришлось поменять содержимое fastersecurerandom.properties
с
securerandom.source=file: /dev/urandom
в
securerandom.source=file: /dev/./urandom
3) У меня не было файла tomcat.conf
, поэтому я добавил его в /etc/init.d/tomcat7
(скрипт запуска tomcat - я знаю), прямо перед строкой - catalina_sh() {
JAVA_OPTS="$JAVA_OPTS -Djava.security.properties=/etc/tomcat7/fastersecurerandom.properties"
Обратите внимание, что я добавил 7
к tomcat
здесь.
Стоило сделать ps -deaf | grep tomcat
ps -deaf | grep tomcat
чтобы сначала подтвердить, что новая настройка -D
прошла через команду, а также чтобы убедиться, что она ссылается на правильный файл и что файл был там. Это когда я заметил пропавшие 7
.
Я был на Java 1.7, а на Ubuntu 14.04.1.
Ответ 6
Вместо непосредственного изменения файла java.security
, по крайней мере с Java 8, он документирует уже поддержку следующего системного свойства:
-Djava.security.egd=file:/dev/random
В контексте Tomcat это можно использовать для создания файла bin/setenv.sh
, содержащего следующую строку:
CATALINA_OPTS=-Djava.security.egd=file:///dev/urandom