Медленный запуск на 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