tomcat启动时SecureRandom耗时

同步发布在个人博客:https://njlife.top/post/77/tomcat-secure-random

先来看一段tomcat8启动日志:

SecureRandom.png

tomcat7/8在启动时都会用到org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom生成一个SecureRandom实例作为session ID的生成器。而在有的时候会发现这个步骤比较耗时:

SecureRandom-1.png

这将直接影响tomcat的启动速度。

接下来看看为什么会这样,有时候快,有时候慢。

linux系统中的/dev/random与/dev/urandom

在linux系统的/dev下,有两个文件:random和urondom。他们是linux系统中提供的随机数伪设备,对外提供永不为空的随机字节数据流。很多解密程序与安全应用程序需要他们提供的随机数据流。

这两个设备的差异在:

/dev/random

/dev/random的random pool依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用。

/dev/random设备可以保证数据的随机性。/dev/random设备被读取的越多,它的响应越慢。

在生成高质量的加密密钥或者是需要长期保护的场景,需要使用/dev/random。

/dev/urandom

/dev/urandom不依赖系统的中断,所以不会造成进程忙等待,但是数据的随机性也不高。/dev/urandom是非阻塞式的。

解决tomcat启动慢

在上面的截图中,tomcat使用的就是阻塞式的/dev/random,一次启动是12号,一次是17号,这期间也陆续有重启操作。可以看到17号的耗时明显大于12号。解决这个问题的很简单,tomcat读取这个就是为了生成session ID使用,对随机性的要求没那么高,所以解决方案就是让tomcat使用/dev/urandom。可通过下面方式进行配置:

1. 修改tomcat的bin下的catalina.sh文件

在catalina.sh脚本中加入:

-Djava.security.egd=file:/dev/./urandom

至于中间为什么要有一个点,有的人说是jdk的bug,也有人说不是,反正这样配置就对了。

2. 配置jdk路径下的java.security

java.security文件在$JAVA_PATH/jre/lib/security/下,可以用find / -name "java.security"定位。打开文件之后找到如下内容:

# By default, an attempt is made to use the entropy gathering device
# specified by the "securerandom.source" Security property.  If an
# exception occurs while accessing the specified URL:
#
#     SHA1PRNG:
#         the traditional system/thread activity algorithm will be used.
#
#     NativePRNG:
#         a default value of /dev/random will be used.  If neither
#         are available, the implementation will be disabled.
#         "file" is the only currently supported protocol type.
#
# The entropy gathering device can also be specified with the System
# property "java.security.egd". For example:
#
#   % java -Djava.security.egd=file:/dev/random MainClass
#
# Specifying this System property will override the
# "securerandom.source" Security property.
#
# In addition, if "file:/dev/random" or "file:/dev/urandom" is
# specified, the "NativePRNG" implementation will be more preferred than
# SHA1PRNG in the Sun provider.
#
securerandom.source=file:/dev/random

可以看到对于这个配置的描述,将

securerandom.source=file:/dev/random

改成

securerandom.source=file:/dev/./urandom

接下来再启动tomcat可以发现时间缩短了。

你可能感兴趣的:(tomcat启动时SecureRandom耗时)