我遇到的问题是Tomcat 7在启动时速度非常慢。我在日志文件中找到了这个:
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [12,367] milliseconds.
安全性很重要,当然,但不是在我的开发机器上。我完全可以使用标准的快速随机数发生器。所以我不需要这种非常慢的SecureRandom实现。
问题是:如何禁用它?搜索了一个解决方案,但只找到了一些关于randomClass
属性的弃用信息,可以将其设置为java.util.Random
。我还发现这个属性现在似乎在Tomcat 7中被命名为secureRandomClass
。我试图将它设置为java.util.Random
但是这会失败,因为Tomcat 7将对象强制转换为java.util.SecureRandom(并且它是还记录了指定的类必须扩展java.util.SecureRandom,因此不再可能使用java.util.Random。)
那么如何摆脱这个非常慢的随机数生成器启动,以便我的开发tomcat尽可能快地启动/重启?
答案 0 :(得分:13)
根据TomCat Wiki,您可以使用非阻塞熵源:
"有一种方法可以通过设置以下系统属性来配置JRE以使用非阻塞熵源:-Djava.security.egd=file:/dev/./urandom
"
答案 1 :(得分:5)
您可能需要在服务器上安装 Haveged 。
Tomcat正在使用 SecureRandom 在启动时生成安全ID,而SecureRandom正在使用 / dev / random 或 / dev / urandom 生成随机数。
在一些无头的linux环境中, / dev / random 熵池可能会产生低质量的随机性,并且在生成随机数时反应非常慢。
有一篇很好的文章解释 Haveged 如何解决这个问题。
how-to-setup-additional-entropy-for-cloud-servers-using-haveged
答案 2 :(得分:2)
您可能需要修补Tomcat。
虽然作为一个hack,你总是可以尝试使用包装标准java.util.Random实例的东西扩展java.util.SecureRandom .......这至少会超过强制转换问题。
另一个想法......减速可能是由于耗尽的熵池造成的?你可能想尝试在池中获得更多的熵,这可能会让它变得非常快。
答案 3 :(得分:2)
从securerandom.source=...
文件中找到$JAVA_PATH/jre/lib/security/java.security
并将其更改为securerandom.source=file:/dev/./urandom
答案 4 :(得分:1)
旧问题,但仍然存在......在我的情况下使用嵌入式Tomcat。
lsof
解决方案对我不起作用。所以我用Google搜索了animate.css,但在使用/dev/random
进行了一些测试之后,显然解决方法不再适用了。快速understanding the issue确认当前实现忽略了此系统属性。
问题是apt-get install rng-tools
rngd -r /dev/urandom # Run once during system start up
上的Tomcat阻塞,所以我找到了向系统添加熵的方法,并找到了look at the code哪个工作得很好!在Debian中作为root:< / p>
custom-search-box
它可能不是超级安全的,但在我看来,这对于会话ID生成来说已经足够了。
顺便说一句,我最终使用了Jetty。如果你不需要Tomcat的所有功能,那就快得多。
答案 5 :(得分:0)
如果您的硬件支持,请尝试使用Java RdRand Utility: http://code.google.com/p/lizalab-rdrand-util/
它基于英特尔的RDRAND指令,速度比SecureRandom快10倍,大容量实现没有带宽问题。
完全披露,我是该实用程序的作者。