Security

如何使用 Java keytool 生成新的 2048 位 Diffie-Hellman 參數?

  • August 20, 2016

我們是非專家嘗試 - 迄今為止未成功 - 更新我們的 Web 伺服器 (JBoss-5.1.0.GA) 設置以滿足 Diffie-Hellman 標準。在https://weakdh.org/sysadmin.html上執行測試後,我們被告知需要“生成新的 2048 位 Diffie-Hellman 參數”。過去,我們使用 Java keytool 生成了密鑰,但我們一直無法找到有關使用 Java keytool 生成新的 2048 位 Diffie-Hellman 參數的任何資訊。有誰知道如何做到這一點或可以指出我們正確的方向?謝謝!

**你不能用 keytool 做到這一點。**首先,keytool根本不支持DH。其次,keytool不會為任何算法自己生成參數,只會生成私鑰/密鑰對。第三,當keytool生成一個密鑰對時,它也會生成一個自簽名證書(有時會被“真正的”CA 頒發的證書替換),並且不可能為 DH 生成一個自簽名證書,因為 DH 不簽名。您可以編寫一個非常簡單(大約 10 行)的 Java 程序來生成 DH 參數。但這可能對您沒有任何好處,因為:

**無論如何,Java 在這裡不接受 DHE 參數。**JbossWS(Jboss webserver,後來的 Wildfly)是 Tomcat 的一個分支,通常使用 SSL/TLS 的 Java 實現,JSSE。在 Java 7 之前,JSSE 使用它自己的 DHE 參數,這些參數是 768 位的,這太弱了。(除了 JSSE 遵守 DH-512 的 RFC 要求的 EXPORT 套件,這完全被破壞了,但是 EXPORT 套件在設計上完全被破壞了,並且在 Java 7 中預設禁用。)Java 8 JSSE 允許您控制 DHE 參數的大小,而不是實際值。

您的(一些重疊的)選項是:

使用 Java 8。Java 8中的 JSSE,但不是更早的版本,預設 DHE 為 1024 位,儘管 weakdh.org 沒有,但大多數權威人士認為它足夠強大,並且允許您指定更多,請參閱https://docs.oracle.com /javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#customizing_dh_keys和背景https://stackoverflow.com/questions/30352105/how-to-set-custom-dh-group-in-java -sslengine-to-prevent-logjam-attack。請注意,如果您在 Java 8 之前有任何 Java客戶端,如果伺服器使用超過 1024 位的 DHE ,它們將*失敗。*我不知道有任何其他客戶有此問題,但在送出此更改之前先測試您的客戶。

**啟用 ECDHE。**Java 7 及更高版本中的 JSSE 實現了 ECDHE,它不像 DHE 那樣需要預先計算,(通常)使用 P-256,這已經足夠強大了。(儘管有些人不信任任何NIST ECC 曲線,因為 NIST 通常受 NSA 的影響,儘管我所知道的開原始碼中沒有專門顯示 ECC 曲線存在問題。)Java 6 實際上具有用於 ECDHE 的 JSSE 部分但僅當 JVM 具有 ECC 原語的加密“提供程序”時才啟用它,而 Java 6 沒有。來自http://www.bouncycastle.org/的bcprov-*-jdk15on是一系列 Java 加密原語的 JCE 提供程序,包括 ECC,因此如果您將 jar 添加到您的 jarJRE/lib/ext並添加org.bouncycastle.jce.provider.BouncyCastleProvider到列表中JRE/lib/security/java.security(或做一個合適的Security.add/insertProvider()在你的程式碼早期的某個地方)Java 6 可以做 ECDHE。當然,您是否應該繼續使用 Java 6 本身就是一個問題。

幾年前,在瀏覽器和其他客戶端中對 ECDHE 的支持是不確定的,但今天 AFAIK 所有最新的瀏覽器都支持它,並且比 DHE更喜歡它——也就是說,瀏覽器 hello 在 DHE 套件之前列出了 ECDHE 套件,所以如果伺服器同時實現兩者,它應該選擇 ECDHE。非瀏覽器客戶端可能不會;測試確定。

**禁用 DHE。**您可以在 Connector 屬性中配置密碼列表以排除 DHE 密碼;當您使用它時,還排除無用的 staticDH 和 staticECDH,以及(單個)DES 和(全部)“EXPORT”(如果存在)(Java 6)。這意味著不執行 ECHDE 的瀏覽器和客戶端將被困在純 RSA 和沒有前向保密中,但至少它們具有​​“目前”保密。我不記得了,但我認為 5.1 連接器配置仍然像$server/deploy/jbossweb/server.xml.

**嘗試原生。**正如我所說的 JbossWS 是從 Tomcat 開始的,它可以選擇使用“native”又名“APR”來實現 HTTPS(SSL/TLS),這實際上是內部的 OpenSSL 而不是 JSSE。我在讓這個選項在 JbossWS 上工作方面取得了喜憂參半的成功,並且不記得大約 5.1。如果您的 JbossWS 有一個可行的 TC-native 選項,並且如果它可以處理配置 DH 參數,那麼使用 openssl 生成 DH 參數和 JbossWS-native 指令來配置它們。

引用自:https://serverfault.com/questions/722182