[英]Slow startup on Tomcat 7.0.57 because of SecureRandom
我在 CentOS 6.6 32 位和 openJDK7 上使用 Tomcat 7.0.57。 當我在我的服務器(生產環境)上啟動 Tomcat 的 14 個不同實例時,其中許多實例啟動時間太長。
這是啟動日志的一部分,它告訴我一直在哪里
Jan 28, 2015 2:49:41 PM org.apache.catalina.util.SessionIdGenerator createSecureRandom
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [199,620] milliseconds.
這個問題的最佳實踐/解決方案是什么?
謝謝!
我遇到了同樣的問題 ,即tomcat啟動速度太慢。 我在DigitalOcean上關注這篇文章並安裝了hasged而不是使用urandom。
hasged允許基於處理器上的代碼執行時間的變化來生成隨機性。 由於一段代碼幾乎不可能花費相同的執行時間,即使在同一硬件上的相同環境中,運行單個或多個程序的時間也應該適合種子隨機源。 在反復執行循環后,使用處理器的時間戳計數器(TSC)中的差異,偽造的實現會使系統的隨機源(通常為/ dev / random)變為種子
請按照本文中的步驟操作。 https://www.digitalocean.com/community/tutorials/how-to-setup-additional-entropy-for-cloud-servers-using-haveged
我在這里貼了它
安全隨機調用可能是阻塞的,因為沒有足夠的熵來在/ dev / random中提供它們。
如果你有線
securerandom.source=file:/dev/random
在/jre/lib/security/java.security中,將此更改為urandom可能會改進(雖然這可能已經是默認設置)。
或者,有一些關於如何在這里喂池的建議
https://security.stackexchange.com/questions/89/feeding-dev-random-entropy-pool
根據Henry的回答,這里有一些調整tomcat的具體說明
創建/etc/tomcat/fastersecurerandom.properties
securerandom.source=file:/dev/urandom
編輯/etc/tomcat/tomcat.conf
JAVA_OPTS
JAVA_OPTS="-Djava.security.properties=/etc/tomcat/fastersecurerandom.properties"
僅供參考,我發現我無法使用JAVA_OPTS="$JAVA_OPTS ..."
設置多個JAVA_OPTS
,盡管有注釋掉的例子。 根據/var/log/messages
的警告,可憐的舊混淆tomcat 7無法啟動
在不同的版本/風格上,您可以找到最適合為tomcat設置環境變量的位置的變體。 如果它們正在生效,調試的最佳方法是檢查運行的命令,如下所示:
$ ps aux | grep java
tomcat 4821 4.7 13.9 2626888 263396 ? Ssl 22:31 0:23 /usr/lib/jvm/jre/bin/java -DJENKINS_HOME=/opt/jenkins/ -Xmx512m -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Djava.security.properties=/etc/tomcat/fastersecurerandom.properties -classpath /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat -Dcatalina.home=/usr/share/tomcat -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat/temp -Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
我更改了/jre/lib/security/java.security,如下:securerandom.source = file:/ dev /./ urandom
@KCD上面的答案幾乎對我有用,我需要按摩一下 - 如下:
1)我的tomcat是tomcat7
,所以我在/etc/tomcat7
目錄中創建了我的fastersecurerandom.properties
文件,
2)根據另一頁 ,我不得不改變fastersecurerandom.properties
內容
securerandom.source=file:/dev/urandom
至
securerandom.source=file:/dev/./urandom
3)我沒有tomcat.conf
文件,所以我添加到我的/etc/init.d/tomcat7
的啟動腳本 - 我知道),就在行之前 - catalina_sh() {
JAVA_OPTS="$JAVA_OPTS -Djava.security.properties=/etc/tomcat7/fastersecurerandom.properties"
注意我也在這里添加了7
到tomcat
。
做一個ps -deaf | grep tomcat
是值得的 ps -deaf | grep tomcat
首先確認新的-D
設置是否通過命令,並檢查它是否指向正確的文件,並且該文件在那里。 這是我注意到失蹤的7
。
我在Java 1.7和Ubuntu 14.04.1上。
而不是直接更改文件java.security
,至少使用Java 8,它已經支持以下系統屬性:
-Djava.security.egd=file:/dev/random
在Tomcat的上下文中,可用於創建包含以下行的文件bin/setenv.sh
:
CATALINA_OPTS=-Djava.security.egd=file:///dev/urandom
配置彈簧啟動
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors().and().csrf().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) //using JWT
.and()
.authorizeRequests()
.antMatchers(PUBLIC_ENDPOINTS).permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(authFilter(), UsernamePasswordAuthenticationFilter.class);
}
.cors().and().csrf().disable()
這本身並不是一個答案。 但這是一些背景信息,以防您想知道此日志行的來源。
當生成時間超過十分之一秒(100 毫秒)時,會觸發此日志行
這條線在 2014 年曾經是級別的 INFO...
...但在 2017 年更改為 WARN 級別...
...使其在日志中更加突出。 這種變化的動機是這里的錯誤報告:
消息在這里觸發: https : //github.com/apache/tomcat/blob/main/java/org/apache/catalina/util/SessionIdGeneratorBase.java#L272
long t2 = System.currentTimeMillis();
if ((t2 - t1) > 100) {
log.warn(sm.getString("sessionIdGeneratorBase.createRandom",
result.getAlgorithm(), Long.valueOf(t2 - t1)));
}
人類可讀的英文文本來自這里: https : //github.com/apache/tomcat/blob/main/java/org/apache/catalina/util/LocalStrings.properties#L46
sessionIdGeneratorBase.createRandom=Creation of SecureRandom instance for session ID generation using [{0}] took [{1}] milliseconds.
如果您正在使用 spring 安全性,請添加 web 安全性 class。
@EnableWebSecurity 公共 class WebSecurity 擴展 WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// ...
http.cors();
//other configure params.
http.csrf().disable();
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration().applyPermitDefaultValues();
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.setAllowCredentials(true);
source.registerCorsConfiguration("/**", corsConfiguration);
return source;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.