web-dev-qa-db-ja.com

Java keytoolを使用して新しい2048ビットDiffie-Hellmanパラメータを生成する方法

私たちは専門家ではない-これまでのところうまくいっていない-Webサーバー(JBoss-5.1.0.GA)の設定をDiffie-Hellman規格に合わせて更新しようとしています。 https://weakdh.org/sysadmin.html でテストを実行した後、「2048ビットの新しいDiffie-Hellmanパラメータを生成する」必要があると言われます。これまでは、Java keytoolを使用してキーを生成しましたが、Java keytool。これを行う方法を知っている人や、正しい方向に向けることができる人はいますか?ありがとうございます!

9
user2072931

keytoolではそれはできません。まず、keytoolはDHをまったくサポートしていません。第2に、keytoolは、アルゴリズムごとにパラメーターを生成せず、秘密鍵/鍵ペアのみを生成します。 3番目に、keytoolがキーペアを生成すると、自己署名証明書も生成され(時々は、「実際の」CA発行の証明書に置き換えられます)、不可能です。 DHは署名しないため、DHの自己署名証明書を生成します。 could 非常に単純な(約10行)Javaプログラムを記述して、DHパラメータを生成します。しかし、次の理由により、おそらく何の役にも立ちません。

Javaはいずれにせよ、ここではDHEパラメータを受け入れません。 JbossWS(Jboss Webサーバー、後のWildfly)はTomcatのフォークであり、通常SSL/TLSのJava実装、JSSEを使用します。 Java 7まで、JSSEは768ビットの独自のDHEパラメータを使用しますが、これは許容できないほど弱いです。 (JSSEが完全に壊れているDH-512のRFC要件に準拠しているEXPORTスイートを除きますが、EXPORTスイートは設計上完全に壊れており、Java 7以降ではデフォルトで無効になっています。) Java 8 JSSEでは、DHEパラメータの size を制御できますが、実際の値は制御できません。

(一部重複する)オプションは次のとおりです。

se Java 8。 JSSE in Java 8、ただし以前ではなく、デフォルトで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 clients がある場合、それらは fail サーバーは1024ビットを超えるDHEを使用します。この問題が発生している他のクライアントは知りませんが、この変更をコミットする前にテストしてください。

Enable ECDHE。 JSSE in Java 7以降は、DHEのような事前計算の対象ではないECDHEを(通常は)十分に強力なP-256を使用して実装します。 (一部の人々はNIST ECC曲線の any を信頼していませんが、NISTは一般にNSAの影響を受けるため、私が知っているオープンソースでは特にECC曲線に問題があることを示していません。)Java 6には実際にはECDHEのJSSE部分がありますが、JVMにECCプリミティブ用の暗号「プロバイダー」があり、Java 6にはない場合にのみ有効になります。 bcprov-*-jdk15on from http://www.bouncycastle.org/ は、ECCを含むJava暗号プリミティブの範囲のJCEプロバイダーであるため、jarを_JRE/lib/ext_および_org.bouncycastle.jce.provider.BouncyCastleProvider_を_JRE/lib/security/Java.security_のリストに追加します(またはコードの早い段階で適切なSecurity.add/insertProvider()を実行します)Java 6 ECDHE。もちろん、Java 6をまだ使用する必要があるかどうかは、それ自体が問題です。

数年前、ブラウザやその他のクライアントでのECDHEのサポートは不確かでしたが、今日のAFAIKはすべての最新のブラウザでサポートされ、 prefer でDHEに対応しています-つまり、 browser helloはDHEスイートの前にECDHEスイートをリストするので、サーバーが両方を実装する場合はECDHEを選択する必要があります。ブラウザ以外のクライアントはおそらくそうではありません。確実にテストする。

DHEを無効にします。 DHE暗号を除外するように、Connector属性で暗号のリストを構成できます。同時に、役に立たないstaticDHとstaticECDHを除外し、(単一)DESおよび(すべて) "EXPORT"が存在する場合はそれを除外します(Java 6)。つまり、ECHDEを実行しないブラウザとクライアントは、プレーンなRSAとForward Secrecyなしでスタックしますが、少なくとも「現在」の秘密性があります。はっきりとは覚えていませんが、5.1 Connectorの構成は_$server/deploy/jbossweb/server.xml_のようなものでした。

ネイティブを試してください JbossWSが最初から言ったように、Tomcatには、「ネイティブ」または「APR」を使用してHTTPS(SSL/TLS)を実装するオプションがあり、これは実際にはJSSEではなくOpenSSLです。私はこのオプションをJbossWSで機能させることに成功しましたが、5.1については覚えていません。 If JbossWSに実行可能なTCネイティブオプションがあり、 if それはDHパラメーターの構成を処理できる場合、opensslを使用してDHパラメーターを生成しますそして、それらを設定するためのJbossWSネイティブの指示。

13

実際には、カスタムDHEパラメータ 最近のJava 8バージョン を指定できます。これは、アプリケーションの独立性です(JSSE TLS実装を使用している限り)。

最初に、使用するDHEキーのサイズを指定する必要があります(-Djdk.tls.ephemeralDHKeySize=1024または-Djdk.tls.ephemeralDHKeySize=2048)。サーバーでは、これはDHEに対して事前定義されたジェネレーター/プライムの組み合わせを使用します。 Java 8では、1024または2048のみ使用できます JDK 9はより大きなサイズをサポートします

別の組み合わせを提供する場合は、jdk.tls.server.defaultDHEParametersセキュリティプロパティを使用してjre/lib/security/Java.securityでそれらを指定できます(8u51以降)。パラメータのリスト(使用されるキーサイズごとに1つ)を取り、素数とジェネレータ(通常は2または5)を16進数として含める必要があります。

openssl dhparam -out dhparam2048.pem 2048を使用して新しいペアを生成した場合は、openssl dhparam -noout -text -check -in dhparam2048.pemを使用して、そのファイルをテキストモードで読み取り、印刷できます。テキストをコピーしてJavaセキュリティプロパティに貼り付ける必要があります(opensslの16進表現間のtr -d ':'を削除するには:を使用)

次にサンプルを示します(1024 bisのみ)。

>openssl dhparam -in p -check -text -noout | tr -d ':'
PKCS#3 DH Parameters: (1024 bit)
    prime:
       00f7a63b59edcc43a43df12077f0e9
        14129c20a73cef95f919896e608ebc
        8722776c948765bbbf61542e118329
        6c6ea74ecbded3a93aff77a062aba4
        fcf04fc01030e65077f5a802605058
        65b836368dd5ea389d77691fac0f2c
        f7a161c51c8e97ddecb3cf7f872b0c
        cfaf54373d5203edcabc575e871bb1
        107ec2f30c78ebf403
    generator: 2 (0x2)
DH parameters appear to be ok.

そしてこれは

jdk.tls.server.defaultDHEParameters= \
    { \
        00f7a63b59edcc43a43df12077f0e9 \
        14129c20a73cef95f919896e608ebc \
        8722776c948765bbbf61542e118329 \
        6c6ea74ecbded3a93aff77a062aba4 \
        fcf04fc01030e65077f5a802605058 \
        65b836368dd5ea389d77691fac0f2c \
        f7a161c51c8e97ddecb3cf7f872b0c \
        cfaf54373d5203edcabc575e871bb1 \
        107ec2f30c78ebf403, 2 }

多くの場合、プロセスが単純ではないため、サーバーを再起動し、サーバーが実際にこのプライムを使用していることを確認する必要があります(デフォルトのものではありません)。デフォルトが定義されています ソース内 、2048ビットの場合、素数はTLS FFDHEドラフトからです。

たとえば、openssl s_clientを実行している場合、Java 8 JSSEサーバーに接続すると、1024ビットの素数(ffffff ffffffffffc90f ... 5381ffffffffffffffff)が表示されます。

>openssl s_client -msg -cipher DHE-RSA-AES128-SHA256 -connect localhost:1234
...
<<< TLS 1.2 Handshake [length 018f], ServerKeyExchange
0c 00 01 8b 00 80 ff ff ff ff ff ff ff ff c9 0f
da a2 21 68 c2 34 c4 c6 62 8b 80 dc 1c d1 29 02
4e 08 8a 67 cc 74 02 0b be a6 3b 13 9b 22 51 4a
08 79 8e 34 04 dd ef 95 19 b3 cd 3a 43 1b 30 2b
0a 6d f2 5f 14 37 4f e1 35 6d 6d 51 c2 45 e4 85
b5 76 62 5e 7e c6 f4 4c 42 e9 a6 37 ed 6b 0b ff
5c b6 f4 06 b7 ed ee 38 6b fb 5a 89 9f a5 ae 9f
24 11 7c 4b 1f e6 49 28 66 51 ec e6 53 81 ff ff
ff ff ff ff ff ff 00 01 02 ...

これの代わりに、インストール時にカスタムパラメータを確認する必要があります。

Java 7(768ビット)のデフォルトパラメータは "e9e642 ... 7a3daf"で、長いジェネレータ "30470ad..529252" ParameterCacheで定義されている を使用します。

4
eckes

私はこれと同じ問題を経験してきましたが、Glassfishからです。

最初に、暗号化/証明書セキュリティとJavaのバージョン間のリンクを削除するため、JBossサーバーの前にある種のリバースプロキシを配置することをお勧めします(可能な場合)あなたは走っています。

768ビットより大きいEphemeral DHキー長を取得するには、Java 8.で実行する必要があります。1024が新しいデフォルトであり、jdk.tls.ephemeralDHKeySizeを使用して最大2048に到達できます詳細: DHキーのカスタマイズ )。私が見つけたものから、Javaでキーパラメータを個別に再生成するという概念はありません。

3
David Hutchison