鍵交換は DHE_RSA です。これは、RSA によって認証されたDiffie Hellman Ephemeralを意味します。DHE キーや DHE パラメータでさえ、証明書には含まれていません。これは、一時的ではなく、長期的 (FSVO ロング) です。証明書のキーは RSA であり、Java は安全なサイズの RSA を問題なく処理できます。現在は 1024 を超え、従来は 2048 です。
直接的な修正は、古い Java 互換の弱いDH(E) パラメータを使用することです。OpenSSL を使用するか、証明書および(RSA) 秘密鍵に PEM 形式のファイルを使用する SSL/TLS サーバー プログラムは、おそらく 12 以上あります。(多くのソフトウェアはcertにPEM を使用または処理できますが、ほとんどの OpenSSL は privatekey に使用します。) これらのサーバー プログラムの多くは DH(E) パラメータを構成できますが、私が見たものはすべて異なる方法で行います。あなたのものを識別しません。
回避策は、DHE_anything を避け、プレーンな RSAキー交換を使用することです。OpenSSL を含むすべての SSL/TLS 実装がこれを実装しています。ただし、ほとんどのアプリケーションやミドルウェアはそれを好まなくなり、Forward Secrecyを提供しないため、許可しないものもあります。暗号スイートをどのように制御するか、つまり鍵交換をどのように制御するかは、未確認のサーバー プログラムに依存します。
より良い回避策は、可能であればECDHE (証明書/キーが RSA であるため、具体的には ECDHE_RSA) を有効にすることです。
3A。Java6 JSSE は ECDHE プロトコルを実装しますが、JRE に ECC プリミティブ用の JCE "プロバイダー" が存在し、提供されている Oracle/Sun JRE6 (および OpenJDK の TTBOMK) に ECC プロバイダーがない場合にのみ、それらを有効にします。ECC プロバイダーを JRE6に追加するには
http://www.bouncycastle.org/latest_releases.htmlbcprov-jdk15on-$version.jar
からダウンロードして、JRE/lib/ext
編集JRE/lib/security/java.security
してプロバイダーのリストに次のような行を追加しますsecurity.provider.N=org.bouncycastle.jce.provider.BouncyCastleProvider
N は次に利用可能な番号です.
JRE7 には ECC プロバイダーが含まれており、ECDHE がオプションである場合はすぐに使用できます。
3B. サーバーが OpenSSL 1.0.0 以降を使用している場合 (特定の古い RedHat ビルドを除く)、ECDHE を実装していますが、(1) 暗号スイートが有効になっている場合にのみ使用できます。これはデフォルトでは true ですが、サーバー プログラムによって無効にすることができます。またはその構成、および(2)サーバープログラムがtmp_ecdhパラメーターを設定します(または1.0.2では自動設定を有効にします)。これらは両方とも未確認のサーバー プログラムに依存しており、サーバー プログラムが OpenSSL を使用していない場合、答えは大きく異なる可能性があります。
サーバー プログラムとその構成の SSL/TLS 関連部分を特定できれば、私 (またはおそらく他の誰か) がより具体的になる可能性があります。
編集サーバーはnginxです:
(1) nginx は、Java(6,7) が処理できる DHE パラメータを使用できる必要があります。http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_dhparamを参照して、
openssl dhparam 1024 >mydhfile
(または、本当に必要な場合は、より小さい DSA-1 サイズ = 512 から 1024 で 64 の倍数ですが、1024 より小さいサイズは必要ありません。お勧めしません)。
(2) または、DHE を無効にするには、追加せずに、ssl_ciphers 文字列に少なくとも一部の kRSA (または単に RSA) を追加します。コメントの文字列を少なくとも次のように変更します
EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH:kRSA:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS
または、変更されていない JRE6 は ECDHE (または TLSv1.2) を提供せず、削除する必要がある PSK、SRP、DSS、または aNULL を追加していないため、3DES を信用せず (なぜですか?)、RC4 と Java はそうではありません。 SEED または Camellia を実装すると、もっと簡単に使用できます。
AES128-SHA:AES256-SHA
(これらは実際には TLS_RSA_WITH_AES*_CBC_SHA ですが、ヒステリックなレーズンの場合、OpenSSL 名では RSA と CBC が省略されています。)
Tomcatはデフォルトで Java (JSSE) を使用して HTTPS 接続を処理しますが、パッケージ化/インストールによっては、「Tomcat ネイティブ」または単に「ネイティブ」とも呼ばれる APR (実際には OpenSSL) を使用することがよくあります。Tomcat/JSSE が JRE6 または 7 で実行されている場合、JRE6,7 クライアントが処理できる DHE サイズ 768 を使用します。JRE8 で実行すると、JRE6,7 クライアントが処理できるサイズがデフォルトで 1024 になります。Tomcat/APR が何を使用しているかはわかりませんが (簡単にテストすることはできません)、1024 以下である可能性があります。Tomcat/APR を実行し、openssl 1.0.2を利用できるようにしたい場合は、 openssl s_client -connect host:port -tls1 -cipher EDH+AES
;を使用します。接続したらQに入り、戻ります。「Server Temp Key」の約20行を探します。