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


9

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

回答:


13

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

とにかく、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パラメータのサイズを制御しますが、実際の値は制御しません。

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

Java 8の JSSEをJava 8で使用します。以前のバージョンではありませんが、DHEのデフォルトは1024ビットです。これは、weakdh.orgでは十分ではないとしても、ほとんどの当局では十分強力であると見なしており、さらに指定することができます。https: //docs.oracle.comを参照してください。 /javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#customizing_dh_keysおよび背景/programming/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がNSAの影響を受けているため、NIST ECC曲線を信頼していませが、私が知っているオープンソースでは特にECC曲線に問題があることを示していません。Java6には、実際にはECDHEのJSSE部分があります。ただし、JVMにECCプリミティブ用の暗号「プロバイダー」があり、Java 6にはない場合にのみ有効になります。bcprov - * -からjdk15on http://www.bouncycastle.org/はあなたにjarファイルを追加するには、そうならば、ECCなど、Java暗号プリミティブの範囲のためのJCEプロバイダですJRE/lib/extと追加org.bouncycastle.jce.provider.BouncyCastleProviderのリストにJRE/lib/security/java.security(または適切な操作を行いますSecurity.add/insertProvider()コードの早い段階で)Java 6はECDHEを実行できます。もちろん、Java 6をまだ使用する必要があるかどうかは、それ自体が問題です。

数年前、ブラウザーやその他のクライアントでのECDHEのサポートは不鮮明でしたが、今日のAFAIKはすべて最新のブラウザーでサポートしており、DHE よりも優先しています。サーバーが両方を実装する場合は、ECDHEを選択する必要があります。ブラウザ以外のクライアントはおそらくそうではありません。確実にテストする。

DHEを無効にします。コネクターの属性で暗号のリストを構成して、DHE暗号を除外することができます。同時に、役に立たない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については覚えていません。場合は、あなたのJBossWS実用TC-nativeオプションを持っている、とあれば、それはDHパラメータを設定扱うことができ、その後、それらを設定するためにDHパラメータとのJBossWSネイティブ命令を生成するためにOpenSSLを使用しています。


この素晴らしい情報をありがとう。私たちの答えは最終的にkeytoolを含まず、server.xmlファイルを変更しただけですが、この答えを確認します。
user2072931 2015

4

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

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

別の組み合わせを提供する場合は、jre / lib / security / Java.securityでjdk.tls.server.defaultDHEParametersセキュリティプロパティを指定します(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 }

多くの場合、プロセスが単純ではないため、サーバーを再起動し、サーバーが実際にこのプライムを使用していることを確認する必要があります(デフォルトのものではありません)。デフォルトはsourceで定義さています。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"となり、ParameterCacheで定義されているように、長いジェネレータ "30470ad..529252"が含まます。


3

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

最初に、JBossサーバーの前に何らかのリバースプロキシを配置することをお勧めします(可能な場合)。これにより、暗号/証明書セキュリティと実行中のJavaのバージョン間のリンクが削除されます。

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


この代替案の提案に感謝します。これについては、今後検討する予定です。
user2072931 2015

参照、今があるserverfault.com/a/798036/4591は
eckes

glassfish / payara / payara-microがDHE暗号を無効にする<ssl tls-enabled="false" classname="com.sun.enterprise.security.ssl.GlassfishSSLImpl" tls11-enabled="false" cert-nickname="s1as" ssl3-tls-ciphers="+TLS_RSA_WITH_AES_256_CBC_SHA,+TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,+TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA256,+TLS_ECDH_RSA_WITH_AES_256_CBC_SHA256,+TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,+TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,+TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA256,+TLS_ECDH_RSA_WITH_AES_256_GCM_SHA256"></ssl>ために<protocol name="http-listener-2" security-enabled="true">SSLコネクタに追加
Markus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.