博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tomcat启动Creation of SecureRandom instance卡住解决办法
阅读量:4984 次
发布时间:2019-06-12

本文共 2046 字,大约阅读时间需要 6 分钟。

本文描述Tomcat启动因为 Creation of SecureRandom instance for session ID generation using [SHA1PRNG] 卡住的问题,以及解决办法

注:我的独立博客对应链接:

背景

起因是线上Tomcat的启动缓慢,看到日志里面有一行:

[2019-05-17 14:06:20] [localhost-startStop-1] INFO o.a.c.util.SessionIdGenerator [T:] Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [213,586] milliseconds.

原因

简单google了一下,是Java的SecureRandom是同步读的操作系统的/dev/random

(具体的这个配置是在JAVA_HOME/jre/lib/security/java.security这个文件里面的securerandom.source= 这个配置项)
由于entropy pool(熵池)里面的值不够,所以卡住在读/dev/random上了,造成了启动缓慢

解决方法

1. 根据tomcat官方文档给出的方式(https://wiki.apache.org/tomcat/HowTo/FasterStartUp),在jvm启动的时候加入-Djava.security.egd=file:/dev/./urandom即可2. 或者把JAVA_HOME/jre/lib/security/java.security里面的securerandom.source的值改为file:/dev/./urandom也可以

上述方法二选一即可。

./urandom是什么鬼

但是这里有个很奇怪的地方,为什么写法是file:/dev/./urandom,而不是file:/dev/urandom,我搜索了一下,换成file:/dev/urandom是不会生效的,读的还是file:/dev/random。这是jvm的一个bug,相关的记录

If java.security.egd or securerandom.source point to "file:/dev/random" or "file:/dev/urandom", we will use NativeSeedGenerator, which calls super() which calls SeedGenerator.URLSeedGenerator(/dev/random). (A nested class within SeedGenerator.)  The only things that changed in this bug was that urandom will also trigger use of this code path.

其实最后都call到同一个SeedGenerator.URLSeedGenerator(/dev/random)上面去了

所以才有了这个workaround用file:/dev/./urandom这个格式。

但是这个问题在开发环境并不存在,为什么预发/线上会有?

因为我们的开发环境是redhat,线上是debian , 直接cat /dev/random就能发现开发环境能马上显示好几屏的随机数,而线上环境只有不到20个字符。具体/dev/random是啥见wikipedia:.

这里摘取其中的一段

随机数发生器有一个容纳噪声数据的熵池,在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止。这样的设计使得/dev/random是真正的随机数发生器,提供了最大可能的随机数据熵,建议在需要生成高强度的密钥时使用。/dev/random的一个副本是/dev/urandom(“unblocked”,非阻塞的随机数发生器),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。/dev/random也允许写入,任何用户都可以向熵池中加入随机数据。即使写入非随机数据亦是无害的,因为只有管理员可以调用ioctl以增加熵池大小。Linux内核中当前熵的值和大小可以通过访问/proc/sys/kernel/random/文件夹中的文件得到

转载于:https://www.cnblogs.com/ctgulong/p/10982161.html

你可能感兴趣的文章
ASP.NET MVC5----常见的数据注解和验证
查看>>
STM32F072从零配置工程-基于HAL库的串口UART中断配置
查看>>
linux通过c++实现线程池类
查看>>
webpack
查看>>
[转]NopCommerce之视图设计
查看>>
[转]微信公众平台开发入门教程
查看>>
[转].net自定义验证控件CustomValidator的使用
查看>>
c#怎么获取当前页面的url
查看>>
Python Unicode编码方式
查看>>
Centos MySQL Python环境安装
查看>>
如何处理Entity Framework中的DbUpdateConcurrencyException异常
查看>>
Palindrome Partitioning
查看>>
窗口最大化方法
查看>>
js封装Cookie操作
查看>>
日常杂记--1
查看>>
SkyLake平台安装ubuntu16.04.1(Alienware15r2)
查看>>
php类型转换以及类型转换的判别
查看>>
supervisor配置kibana
查看>>
第2节 mapreduce深入学习:6、MapReduce当中的计数器
查看>>
第1节 storm编程:1、storm第一天上次课程内容回顾
查看>>