JavaWeb问题记录——SessionIdGeneratorBase.createSecureRandom

摘要:本文主要记录了在启动Tomcat时,出现的一个警告以及解决办法。

部分内容来自以下博客:

https://www.jianshu.com/p/30aa8e43a396

http://hongjiang.info/jvm-random-and-entropy-source

问题重现

启动Tomcat时,后台打印警告:

 27-Nov-2019 17:26:48.057 警告 [main] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [280] milliseconds.

Java的版本是1.8,Tomcat的版本是9.0.29。

解决办法

修改Java的配置文件

在Java的安装目录下,找到 jre\lib\security 目录,打开 java.security 文件,找到如下配置:

 securerandom.source=file:/dev/random

改为:

 securerandom.source=file:/dev/./urandom

保存,然后重启Tomcat服务器即可,不建议使用这种方式,存在失败的情况。

修改Java运行环境的配置文件

在Tomcat的安装目录下,找到 bin 目录,打开 catalina.sh 文件,添加如下配置:

 JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"

保存,然后重启Tomcat服务器即可,建议使用这种方式,这也是官方推荐的方式。

问题说明

从Tomcat的优化说起

在Tomcat的文档里面提到了一些启动时的优化项,其中一项是关于随机数生成时,采用了Entropy Source(熵源)的策略:

 Tomcat 7+ heavily relies on SecureRandom class to provide random values for its session ids and in other places. Depending on your JRE it can cause delays during startup if entropy source that is used to initialize SecureRandom is short of entropy. You will see warning in the logs when this happens, e.g.:
<DATE> org.apache.catalina.util.SessionIdGenerator createSecureRandom
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [5172] milliseconds.

意思是说,Tomcat在7以后的版本里十分依赖SecureRandom类生成的随机数来做为session ID,如果用于初始化SecureRandom的熵源是个短熵(熵不够用),那么就会报文章开头说的警告了。

熵源

熵的概念最早起源于物理学,用于度量物体的混乱程度。在信息论里面,熵用来描述不确定度。

熵源在类Unix系统中是一个特殊的设备文件,可以用作随机数发生器或伪随机数发生器,与之相关的是 /dev/random 和 /dev/urandom 。

熵源 /dev/random 是一个阻塞发生器,在读取时, /dev/random 设备会返回小于熵池噪声总数的随机字节。 /dev/random 可生成高随机性的公钥或一次性密码本。若熵池空了,对 /dev/random 的读操作将会被阻塞,直到收集到了足够的环境噪声为止。

而熵源 /dev/urandom 则是一个非阻塞的发生器,是 /dev/random 的一个副本,它会重复使用熵池中的数据以产生伪随机数据。这表示对 /dev/urandom 的读取操作不会产生阻塞,但其输出的熵可能小于 /dev/random 输出的熵。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。

Java中的相关配置

在Java的安装目录下,找到 jre\lib\security 目录,打开 java.security 文件,里面提到了SecureRandom类使用SHA1PRNG算法或NativePRNG算法生成随机数。

在类Unix系统(比如Solaris/Linux/MacOS)上它们是基于某种特殊的熵收集设备作为种子来生成的随机数,如前面提到的 /dev/random 。

在Windows系统上,如果指定的是 file:/dev/random 或 file:/dev/urandom ,那么会使用微软的CryptoAPI作为SHA1PRNG算法的种子产生器。

通过配置 java.security.egd 和 securerandom.source 可以指定使用的熵收集设备,配置 java.security.egd 会覆盖 securerandom.source 。

官方建议

在Tomcat的文档里也给出了建议,那就是在Java的运行环境里通过设置 java.security.egd 系统属性来使用非阻塞的熵源:

 -Djava.security.egd=file:/dev/./urandom

至于为什么是 /dev/./urandom ,而不是 /dev/urandom ,这源于Java的一个bug。大意是 /dev/urandom 在某些情况下可能还是最终会转换成调用 /dev/random 。

JavaWeb问题记录——SessionIdGeneratorBase.createSecureRandom的更多相关文章

  1. Linux中tomcat启动很慢,SessionIdGeneratorBase.createSecureRandom耗时5分钟

    通常情况下,tomcat启动只要2~3秒钟,突然有一天,tomcat启动非常慢,要花5~6分钟,查了很久,终于在这篇文章找到了解决方案,博主牛人啊. 原文参见:http://blog.csdn.NET ...

  2. WARNING [main] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [] milliseconds.

    编译安装tomcat-native和tomcat-deamon以后,发现toomcat启动很慢,好久才有响应.以下日志供参考: 11-Sep-2017 12:19:28.102 INFO [main] ...

  3. tomcat启动时SessionIdGeneratorBase.createSecureRandom耗时5分钟的问题

    通常情况下,tomcat启动只要2~3秒钟,突然有一天,tomcat启动非常慢,要花5~6分钟,查了很久,终于在这篇文章找到了解决方案,博主牛人啊. 原文参见:http://blog.csdn.net ...

  4. JavaWeb问题记录——在Windows上启动Tomcat后命令行窗口乱码

    JavaWeb问题记录——在Windows上启动Tomcat后命令行窗口乱码 摘要:本文主要记录了在Windows上启动Tomcat后,命令行窗口出现乱码的问题及解决办法. 问题重现 在Windows ...

  5. tomcat启动时间5分钟左右org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [342,445] milliseconds.

    org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance ...

  6. javaweb初学记录

    原文 链接 http://blog.csdn.net/iojust/article/details/52429805 - ---热情依旧 - 环境搭建: - jdk环境配置 jdk下载: http:/ ...

  7. JavaWeb学习记录(十四)——商城购物之字符串拼接实现最近浏览商品和购物车的功能

    一.字符串拼接的工具类 package blank.util; import java.util.Iterator;import java.util.Map;import java.util.Set; ...

  8. JavaWeb学习记录(七)——MVC操作数据库增删改查与分页功能

    一.分页工具类 package blank.util;import java.util.List; import org.springframework.jdbc.core.JdbcTemplate; ...

  9. JavaWeb开发记录全过程--(1)环境配置

    一. 开发工具:idea 理由:根据idea 如何连接服务器,可以直接在idea上连接服务器 安装:根据IntelliJ IDEA 下载安装(含注册码),进行非常规手段使用idea 二.分析问题: # ...

随机推荐

  1. Redis集群与分布式介绍以及搭建Redis-Cluster

    1 Redis集群 1.1 什么是集群 集群就是很多服务器组成的一个网络.指的是将多台服务器集中在一起,实现同一业务. 1.2 为什么要集群 一台服务器不能满足开发需要的时候,需要多台服务器来支持.这 ...

  2. ABAP分享六 alv显示的几种方式的简单示例

    方法1,也是大家常见的方法通过函数   REUSE_ALV_GRID_DISPLAY TYPES: BEGIN OF  ty_spfli,   "定义结构     carrid like s ...

  3. jQuery插件 distpicker实现多次赋值

    项目里需要实现省市区联动选择功能,使用了一个jQuery插件dispicker,记录一下使用过程中遇到的问题和解决办法. 需要要实现的功能就两个:打开modal框时设置地址,点击重置按钮时重置地址 原 ...

  4. Java 添加超链接到Word文档

    对特定元素添加超链接后,用户可以通过点击被链接的元素来激活这些链接,通常在被链接的元素下带有下划线或者以不同的颜色显示来进行区分.按照使用对象的不同,链接可以分为文本超链接,图像超链接,E-mail链 ...

  5. Java 8——重复注解和注解的作用范围的扩大化

    一.重复注解 在某些情况下,希望将相同的注解应用于声明或类型用途.从Java SE 8发行版开始,重复注解使可以执行此操作. 例如,正在编写代码以使用计时器服务,该服务使能够在给定时间或某个计划上运行 ...

  6. arcgis api for javascript 学习(一) 调用在线发布的动态地图

    1.图中显示为arcgis软件中显示的地图文件 2.调用动态地图主要的是知道动态地图的URL地址 3.通过IDE(webstorm)调用动态地图,如图 4.话不多说,直接上代码 <!DOCTYP ...

  7. Android项目实战之高仿网易云音乐项目介绍

    这一节我们来讲解这个项目所用到的一些技术,以及一些实现的效果图,让大家对该项目有一个整体的认识,推荐大家收藏该文章,因为我们发布文章后会在该文章里面加入链接,这样大家找着就很方便. 目录 第1章 前期 ...

  8. VUE添加网站favicon.ico图标

    1.修改webpack.dev.conf文件   webpack.prod.conf文件 new HtmlWebpackPlugin({ filename: 'index.html', templat ...

  9. WCF、WebAPI、WCFREST、WebService的区别

    目录导航: 1. WCF 2. WebAPI 3. WebService 4. WCFREST 5. 如何选择WCF.WebAPI.WCFREST.WebService 1.WCF 这个是基于SOAP ...

  10. SLES 12: Database Startup Error with ORA-27300 ORA-27301 ORA-27303 While Starting using Srvctl (Doc ID 2340986.1)

    SLES 12: Database Startup Error with ORA-27300 ORA-27301 ORA-27303 While Starting using Srvctl (Doc ...