美文网首页
tomcat启动时SecureRandom耗时

tomcat启动时SecureRandom耗时

作者: Esc_df7c | 来源:发表于2018-06-26 23:49 被阅读0次

    同步发布在个人博客: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耗时

          本文链接:https://www.haomeiwen.com/subject/zgokpxtx.html