Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
适用于Linux和Linux的Oracle Java 8 x64源代码_Java_Security_Tomcat_Ubuntu_Startup - Fatal编程技术网

适用于Linux和Linux的Oracle Java 8 x64源代码

适用于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

我真的认为,在各种平台上安装了大约200个或更多tomcat之后,我已经准备好迎接任何挑战,但这一个很棘手

我创建了一个普通的Ubunutu 14_04映像,并在该系统上安装了来自oracle的Java8TGZ。此外,我在游戏中添加了一个Tomcat8。然后我开始安装香草服务器

在部署tomcat附带的默认应用程序后不久,我想知道那里发生了什么,并进行了一些线程转储。这是阻止tomcat启动的糟糕线程:

"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指向什么

我所理解的是/dev/random可能会耗尽熵(不管这意味着什么),但也许这意味着在某个点上它无法生成更多的随机数)

它可以暂时耗尽熵并阻塞,直到它聚集到足够的程度来分配更多。JVM只需要一点时间就可以为
SecureRandom
实例种子

这需要多长时间取决于系统的噪音和内核如何收集熵

当操作系统无法生成更多数字时,Oracle依靠/dev/random是否明智

在嵌入式系统或第一次启动时的VM中,熵的缺乏可能是一个问题,这些系统具有非常确定的映像,与真实PC相比,几乎没有可获取的熵源,并且内核没有RDRAND指令或类似的指令来获取熵池初始化

随机性不足可能会对密钥生成和其他加密算法造成灾难性影响,例如

因此,是的,与其让系统受损,不如等待,这是相当明智的

引用N.Heninger等人的话

为了理解这些问题发生的原因,我们手动 调查了数百个易受攻击的主机 代表最常见的重复键以及每个 我们获得的私钥(第节) 3.2 ). 几乎所有服务信息都将其识别为无头或嵌入式系统,包括路由器、服务器管理卡、, 防火墙,以及