您好,登錄后才能下訂單哦!
小編給大家分享一下Tomcat啟動時SecureRandom非常慢怎么辦,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
Tomcat 啟動時 SecureRandom 非常慢解決辦法
最近使用阿里云的 Ubuntu 16.04 ESC 服務器運行 Tomcat 時發現,Tomcat 啟動的特別慢,通過查看日志,發現時間主要花在實例化 SecureRandom 對象上了。
由該日志可以看出,實例化該對象使用了253秒,導致整個應用啟動了275秒之久。
注意這條日志:
org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [253,251] milliseconds.
根本原因是 SecureRandom 這個 jre 的工具類的問題。那為什么 SecureRandom generateSeed 這么慢,甚至掛在 Linux 操作系統呢?
Tomcat 7/8 都使用 org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 類產生安全隨機類 SecureRandom 的實例作為會話 ID。
Tomcat 使用 SHA1PRNG 算法是基于 SHA-1 算法實現且保密性較強的偽隨機數生成器。
在 SHA1PRNG 中,有一個種子產生器,它根據配置執行各種操作。
Linux 中的隨機數可以從兩個特殊的文件中產生,一個是 /dev/urandom,另外一個是 /dev/random。他們產生隨機數的原理是利用當前系統的熵池來計算出固定一定數量的隨機比特,然后將這些比特作為字節流返回。熵池就是當前系統的環境噪音,熵指的是一個系統的混亂程度,系統噪音可以通過很多參數來評估,如內存的使用,文件的使用量,不同類型的進程數量等等。如果當前環境噪音變化的不是很劇烈或者當前環境噪音很小,比如剛開機的時候,而當前需要大量的隨機比特,這時產生的隨機數的隨機效果就不是很好了。
這就是為什么會有 /dev/urandom 和 /dev/random 這兩種不同的文件,后者在不能產生新的隨機數時會阻塞程序,而前者不會(ublock),當然產生的隨機數效果就不太好了,這對加密解密這樣的應用來說就不是一種很好的選擇。/dev/random 會阻塞當前的程序,直到根據熵池產生新的隨機字節之后才返回,所以使用 /dev/random 比使用 /dev/urandom 產生大量隨機數的速度要慢。
SecureRandom generateSeed 使用 /dev/random 生成種子。但是 /dev/random 是一個阻塞數字生成器,如果它沒有足夠的隨機數據提供,它就一直等,這迫使 JVM 等待。鍵盤和鼠標輸入以及磁盤活動可以產生所需的隨機性或熵。但在一個服務器缺乏這樣的活動,可能會出現問題。
有2種解決方案:
1. 在Tomcat環境中解決:
可以通過配置 JRE 使用非阻塞的 Entropy Source:
在 catalina.sh 中加入這么一行:-Djava.security.egd=file:/dev/./urandom 即可。
2. 在 JVM 環境中解決:
打開 $JAVA_PATH/jre/lib/security/java.security 這個文件,找到下面的內容:
securerandom.source=file:/dev/random
替換成:
securerandom.source=file:/dev/./urandom
這里值為何要在 dev 和 random 之間加一個點呢?是因為一個 JDK 的 bug,有人反饋即使對 securerandom.source 設置為 /dev/urandom 它也仍然使用的 /dev/random,有人提供了變通的解決方法,其中一個變通的做法是對 securerandom.source 設置為 /dev/./urandom 才行。也有人評論說這個不是 bug,是有意為之。
在 JDK 7 的 java.security 文件里,配置里的是:
# Select the source of seed data for SecureRandom. By default an # attempt is made to use the entropy gathering device specified by # the securerandom.source property. If an exception occurs when # accessing the URL then the traditional system/thread activity # algorithm is used. # # On Solaris and Linux systems, if file:/dev/urandom is specified and it # exists, a special SecureRandom implementation is activated by default. # This "NativePRNG" reads random bytes directly from /dev/urandom. # # On Windows systems, the URLs file:/dev/random and file:/dev/urandom # enables use of the Microsoft CryptoAPI seed functionality. # securerandom.source=file:/dev/urandom
但這個 /dev/urandom 也同那個 bug 報告里所說的等同于 /dev/random;要使用非阻塞的熵池,這里還是要修改為 /dev/./urandom。經測試,貌似 JDK 7 并沒有同注釋里的意思修復了這個問題。
以上是“Tomcat啟動時SecureRandom非常慢怎么辦”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。