5

Java アプリケーションをテストしています。DH 暗号スイートを使用して SSL ハンドシェイクを開始しようとしています。しかし、私は次のエラーが発生しています:

java.lang.RuntimeException: Could not generate DH keypair

を提案BouncyCastleした人もいますが、多くの人がエラーを報告しているため、別の選択肢がある場合は使用しないでください。

http://www.oracle.com/technetwork/java/javase/downloads/index.htmlJava Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Filesからのダウンロードが提案されています。次の 2 つのファイルと. 私がインストールしたことにも気づいたことに注意してください:そして、両方を置き換えました。しかし、それでも同じエラーが表示されます。java.securityjava.policyC:\Program Files (x86)\Java\jre7\lib\securityJava\jre7\securityProgram Files (x86)Program Files

このエラーの回避策はありますか?

編集: スタック トレース:

javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
    at sun.security.ssl.Alerts.getSSLException(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.handleException(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at MyClass.MyClass.myFunction(MyProg.java:78)
    at MyClass.MyClass.main(MyClass.java:233)
Caused by: java.lang.RuntimeException: Could not generate DH keypair
    at sun.security.ssl.DHCrypt.<init>(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverKeyExchange(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    ... 4 more
Caused by: java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive)
    at com.sun.crypto.provider.DHKeyPairGenerator.initialize(DHKeyPairGenerator.java:120)
    at java.security.KeyPairGenerator$Delegate.initialize(Unknown Source)
    ... 11 more

EDIT2: 私のコードは、リモート サーバー (Web サイト) との SSL ハンドシェイクを開始しようとするクライアントとして機能しています。クライアントの暗号スイート リストを次のように設定します。

{
"TLS_ECDHE_RSA_WITH_RC4_128_SHA",
"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", 
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
"TLS_ECDHE_RSA_WITH_NULL_SHA",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",  
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
"SSL_DHE_RSA_WITH_DES_CBC_SHA",
"SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA"
};

クライアントのリストにあるすべての暗号スイートは、Java でサポートされています。サーバーが長い DH キーを提供する場合に SSL ハンドシェークの開始をサポートするように Java クライアントを構成するにはどうすればよいですか?

4

1 に答える 1

3

はい、基本的に #6851461 も #9162249 と #10687200 のだまされています。無制限の強度ポリシーは解決策ではありません。

SSL/TLS クライアントの DHE (およびその他の DH) のプライム サイズは、サーバーから受信したパラメーターから設定する必要があり、クライアントは別のものを選択できません。(これは、スタックトレースの ClientHandshaker.serverKeyExchange です。)

DHE-RSA より優先される ECDHE-RSA (必ずしも BouncyCastle などの ECC プロバイダーを追加した場合は Java 7 または 6 で正常に動作します) が既にあり、サーバーはそれを選択しませんでした。プレーンな RSA を提供していません。Forward Secrecy を使用せずにサーバーも使用する場合は、_DHE_RSA の前に (または代わりに) _RSA_WITH_AES_128_CBC_SHA _RSA_WITH_RC4_128_SHA などのスイートを少なくともいくつか追加してみてください。

もう 1 つの可能性は、サーバー オペレーターに DH 1024 ビットを使用するように依頼することです。実際にはまだ壊れていませんが、いくつかの重要な基準によって禁止されています。

于 2014-02-07T01:39:44.417 に答える