web-dev-qa-db-ja.com

Java httpクライアントとPOODLE

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クライアント。

16
ykaganovich

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


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

これは間違っていることが判明しました。 1つ[〜#〜] must [〜#〜]サポートされているプロトコルのリストから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を含む)を無効にします。

22
ok2c

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

12
yyvess

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

Update:バージョン> = Java 1.8 Update 31 SSLv3はデフォルトで無効になっています。 リリースノート

3
Dungeon Hunter

-Dhttps.protocols = "TLSv1"を設定しているにもかかわらずTLSv1.2が使用されている理由を解明しようとしてかなりの時間を費やした後、ついにこの投稿を見つけました。魔法の旗は確かに-Djdk.tls.client.protocols = "TLSv1"であり、Apache Axis 1.4クライアントは再び機能します。したがって、Java 7からJava 8に移動する場合は、このフラグをpre Java 8 used TLSv1はデフォルトとしてJava 8はTLSv1.2を使用します

ありがとう!

0
edge66