簡體   English   中英

由於 SecureRandom,Tomcat 7.0.57 啟動緩慢

[英]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是一種不會在安全方面妥協的解決方案。

hasged允許基於處理器上的代碼執行時間的變化來生成隨機性。 由於一段代碼幾乎不可能花費相同的執行時間,即使在同一硬件上的相同環境中,運行單個或多個程序的時間也應該適合種子隨機源。 在反復執行循環后,使用處理器的時間戳計數器(TSC)中的差異,偽造的實現會使系統的隨機源(通常為/ dev / random)變為種子

如何安裝hasged

請按照本文中的步驟操作。 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"

注意我也在這里添加了7tomcat

做一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM