适用于Linux和Linux的Oracle Java 8 x64源代码
我真的认为,在各种平台上安装了大约200个或更多tomcat之后,我已经准备好迎接任何挑战,但这一个很棘手 我创建了一个普通的Ubunutu 14_04映像,并在该系统上安装了来自oracle的Java8TGZ。此外,我在游戏中添加了一个Tomcat8。然后我开始安装香草服务器 在部署tomcat附带的默认应用程序后不久,我想知道那里发生了什么,并进行了一些线程转储。这是阻止tomcat启动的糟糕线程:适用于Linux和Linux的Oracle Java 8 x64源代码,java,security,tomcat,ubuntu,startup,Java,Security,Tomcat,Ubuntu,Startup,我真的认为,在各种平台上安装了大约200个或更多tomcat之后,我已经准备好迎接任何挑战,但这一个很棘手 我创建了一个普通的Ubunutu 14_04映像,并在该系统上安装了来自oracle的Java8TGZ。此外,我在游戏中添加了一个Tomcat8。然后我开始安装香草服务器 在部署tomcat附带的默认应用程序后不久,我想知道那里发生了什么,并进行了一些线程转储。这是阻止tomcat启动的糟糕线程: "localhost-startStop-1" #15 daemon prio=5 os_p
"localhost-startStop-1" #15 daemon prio=5 os_prio=0 tid=0x00007f37c8004800 nid=0x4d6 runnable [0x00007f37b38b3000]
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:246)
at sun.security.provider.SeedGenerator$URLSeedGenerator.getSeedBytes(SeedGenerator.java:539)
at sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.java:144)
at sun.security.provider.SecureRandom$SeederHolder.<clinit>(SecureRandom.java:192)
at sun.security.provider.SecureRandom.engineNextBytes(SecureRandom.java:210)
- locked <0x00000000f06e6ce8> (a sun.security.provider.SecureRandom)
at java.security.SecureRandom.nextBytes(SecureRandom.java:457)
- locked <0x00000000f06e71c0> (a java.security.SecureRandom)
at java.security.SecureRandom.next(SecureRandom.java:480)
at java.util.Random.nextInt(Random.java:329)
at org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom(SessionIdGeneratorBase.java:234)
“localhost-startStop-1”#15守护进程优先级=5 os#u优先级=0 tid=0x00007f37c8004800 nid=0x4d6可运行[0x00007f37b38b3000]
java.lang.Thread.State:可运行
位于java.io.FileInputStream.readBytes(本机方法)
在java.io.FileInputStream.read(FileInputStream.java:246)处
位于sun.security.provider.SeedGenerator$URLSeedGenerator.getSeedBytes(SeedGenerator.java:539)
位于sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.java:144)
位于sun.security.provider.SecureRandom$SeederHolder。(SecureRandom.java:192)
位于sun.security.provider.SecureRandom.engineNextBytes(SecureRandom.java:210)
-锁定(sun.security.provider.SecureRandom)
位于java.security.SecureRandom.nextBytes(SecureRandom.java:457)
-锁定(一个java.security.SecureRandom)
在java.security.SecureRandom.next(SecureRandom.java:480)
位于java.util.Random.nextInt(Random.java:329)
位于org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom(SessionIdGeneratorBase.java:234)
在更多的google&friends之后,我发现JDK附带的SeedGenerator
是我问题的根源。有趣的是,有时种子生成器在几分钟后返回,有时只是挂起(熵用完?…通过cat/proc/sys/kernel/random/entropy\u avail
检查)。经过进一步的研究,我发现$JAVA\u HOME$/lib/security/JAVA.security
中的一个名为securerandom.source
的配置变量定义了Random的源代码。在我的例子中,或者在oracle JDK 8 linux安装中,它是/dev/random
。我不是Linux专家(我是java开发人员),但我理解的是,/dev/random
可能会耗尽熵(不管这意味着什么),但可能这意味着在某个时候它无法生成更多的随机数)。我切换到/dev/uradom
,我的tomcat一切正常
然后,我检查了其他JDK安装在我的其他各种服务器上的外观,这些服务器是OpenJDK和旧的Oracle JDK安装的混合体。至少OpenJDK总是使用/dev/uradom
答案可能是什么,为什么我以前从未遇到过这个问题
现在我要问的问题是:
/dev/random
在操作系统无法生成更多数字的情况下,依靠Oracle是否明智?我的意思是像Tomcat和其他许多服务器依赖JDK的SeedGenerator
,调试这种错误是非常先进的。我花了两个小时才到达现在的位置 我认为答案取决于此链接对WebLogic的支持:
他们提到“随机”更安全
在Oracle错误评论中(David已经提到):
特别是关于本部分:
由于SHA1PRNG是一个基于MessageDigest的PRNG,因此在应用程序未提供种子数据的情况下,它通常使用/dev/random进行初始种子设定。由于所有未来的值都取决于MessageDigest的现有状态,因此从一个强大的初始种子开始非常重要
改变这种行为对最初的开发人员来说很麻烦。因此他创建了一个新的SecureRandom impl,名为NativePRNG,它尊重java.security.egd值
如果你打电话:
- Linux上的新SecureRandom()和使用的默认值,它将从/dev/uradom读取,而不是阻塞。(在Solaris上,默认情况下使用PKCS11 SecureRandom,并调用/dev/urandom。)
- getInstance(“SHA1PRNG”)并没有指定种子,或新的SecureRandom(),但在“file:/dev/urandom”之外指定了另一个java.security.egd,它将使用SHA1PRNG调用/dev/random,可能会阻塞
- getInstance(“NativePRNG”),它将取决于java.security.egd指向什么
SecureRandom
实例种子
这需要多长时间取决于系统的噪音和内核如何收集熵
当操作系统无法生成更多数字时,Oracle依靠/dev/random是否明智
在嵌入式系统或第一次启动时的VM中,熵的缺乏可能是一个问题,这些系统具有非常确定的映像,与真实PC相比,几乎没有可获取的熵源,并且内核没有RDRAND指令或类似的指令来获取熵池初始化
随机性不足可能会对密钥生成和其他加密算法造成灾难性影响,例如
因此,是的,与其让系统受损,不如等待,这是相当明智的
引用N.Heninger等人的话
为了理解这些问题发生的原因,我们手动
调查了数百个易受攻击的主机
代表最常见的重复键以及每个
我们获得的私钥(第节)
3.2 ). 几乎所有服务信息都将其识别为无头或嵌入式系统,包括路由器、服务器管理卡、,
防火墙,以及