16

POODLE の脆弱性について、私の理解が正しければ、サーバーによってアドバタイズされたより高いバージョンのプロトコルを使用してサーバーとの安全なチャネルを確立できなかった場合に、TLS プロトコルを SSLv3 に自動的にダウングレードするクライアントが必要です。

一般的な Java HTTP クライアント ライブラリ、具体的には javax.net.ssl.HttpsURLConnection および Apache HttpClient は、サーバーとの TLS セッションの確立に失敗したときに、TLS プロトコルを自動的にダウングレードしますか? そうでない場合、(a) サーバーが SSLv3 のみをサポートするか、(b) より高いレベルのロジックがダウングレードを実行しない限り、POODLE 攻撃の影響を受けないというのは正しいですか?

http://blog.hagander.net/archives/222-A-few-short-notes-about-PostgreSQL-and-POODLE.htmlのようなものを探していますが、Java クライアント用です。

4

4 に答える 4

23

Apache HttpClient は、TLS プロトコルの側面をまったく実装していません。TLS/SSL ハンドシェークを行い、安全な SSL セッションを確立するために、JSSE API に依存しています。SSL ホスト名検証ロジックを除いて、TLS/SSL に関する限り、Apache HttpClient はそれが実行されている JRE と同じくらい安全 (または脆弱) です。


更新: HttpClient 4.3 はデフォルトで常に TLS を使用するため、SSLv3 を使用するように明示的に構成しない限り、HttpClientPOODLE に基づくエクスプロイトに対して脆弱ではありません

これは間違っていることが判明しました。サポートされているプロトコルのリストからSSLv3を明示的に削除する必要があります

SSLContext sslContext = SSLContexts.custom()
        .useTLS() // Only this turned out to be not enough
        .build();
SSLConnectionSocketFactory sf = new SSLConnectionSocketFactory(
        sslContext,
        new String[] {"TLSv1", "TLSv1.1", "TLSv1.2"},
        null,
        SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
CloseableHttpClient client = HttpClients.custom()
        .setSSLSocketFactory(sf)
        .build();

更新 2:バージョン 4.3.6 以降、HttpClient はデフォルトで SSL のすべてのバージョン (SSLv3 を含む) を無効にします。

于 2014-10-18T11:58:21.227 に答える
12

https を使用する場合は、Java クライアントで SSL v3.0 を無効にする必要があります。

これは、Java 6/7 で次のプロパティを追加することで実行できます。

-Dhttps.protocols="TLSv1"

Java 8 の場合:

-Dhttps.protocols="TLSv1,TLSv1.1,TLSv1.2"

-Djdk.tls.client.protocols="TLSv1,TLSv1.1,TLSv1.2"

ソース: http://www.oracle.com/technetwork/java/javase/documentation/cve-2014-3566-2342133.html

于 2014-10-26T21:41:56.673 に答える
3

Apache HttpClient 4.3.6 は、デフォルトで SSLv3 を無効にします。

以下は、 Apache HC 4.3.6 リリース ノートからの抜粋です。

リリース 4.3.6

HttpClient 4.3.6 (GA) は、HttpClient OSGi バンドルに関するいくつかの問題と、リリース 4.3.5 以降に報告されたその他の問題を修正するメンテナンス リリースです。

このリリースの時点で、HttpClient はデフォルトで TLS プロトコルを優先して SSL のすべてのバージョン (SSLv3 を含む) を無効にすることに注意してください。SSLv3 を引き続き使用したいユーザーは、SSLv3 のサポートを明示的に有効にする必要があります。

すべての HttpClient バージョンのユーザーは、アップグレードすることをお勧めします。

変更ログ:

  • SSLv3 プロトコルはデフォルトで無効になっています Oleg Kalnichevski による寄稿

更新: Java 1.8 Update 31 以降のバージョンの JVM を実行している場合、SSLv3 はデフォルトで無効になっています。リリース ノートを確認してください。

于 2014-11-07T03:43:54.673 に答える
0

-Dhttps.protocols="TLSv1" を設定しているにもかかわらず、TLSv1.2 が使用されている理由を突き止めるためにかなりの時間を費やした後、最終的にこの投稿を見つけました。魔法のフラグは確かに -Djdk.tls.client.protocols="TLSv1" であり、Apache Axis 1.4 クライアントは再び機能します。したがって、Java 7 から Java 8 に移行する場合は、JAVA 8 が TLSv1.2 を使用するのに対し、JAVA 8 より前はデフォルトとして TLSv1 を使用していたため、このフラグを追加する必要がある場合があります。

ありがとう!

于 2015-02-09T15:39:16.647 に答える