Подтвердить что ты не робот

Java http-клиенты и POODLE

Что касается уязвимости POODLE, если я правильно ее понимаю, для этого требуется, чтобы клиент автоматически уменьшал протокол TLS до SSLv3 при невозможности установить безопасный канал с сервером, используя протокол более высокой версии, рекламируемый сервером.

Выполняют ли общие клиентские библиотеки java-HTTP, в частности javax.net.ssl.HttpsURLConnection и Apache HttpClient, автоматически понижать протокол TLS при невозможности установить сеанс TLS с сервером? Если нет, могу ли я исправить, что они не защищены от атаки POODLE, если только (а) сервер не поддерживает SSLv3, или (б) логика на более высоком уровне выполняет понижение?

Я ищу что-то вроде http://blog.hagander.net/archives/222-A-few-short-notes-about-PostgreSQL-and-POODLE.html, но для клиентов Java.

4b9b3361

Ответ 1

Apache HttpClient не реализует ни один из аспектов протокола TLS. Он использует API JSSE для установления связи TLS/SSL и установления безопасных сеансов SSL. За исключением логики проверки имени хоста SSL, в отношении TLS/SSL Apache HttpClient является безопасным (или уязвимым) как JRE, в котором он запущен.


Обновление: HttpClient 4.3 по умолчанию всегда использует TLS, поэтому, если только он явно не настраивает его на использование SSLv3, HttpClient не должен быть уязвим для эксплойтов, основанных на POODLE.

Это оказалось неправильным. Один 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) по умолчанию.

Ответ 2

Вы должны отключить SSL v3.0 для java-клиентов, если вы используете https.

Это можно сделать, добавив это свойство в 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

Ответ 3

Apache HttpClient 4.3.6 отключает SSLv3 по умолчанию.

Здесь выдержка из Apache HC 4.3.6 примечания к выпуску

Выпуск 4.3.6

HttpClient 4.3.6 (GA) - это релиз обслуживания, который исправляет несколько   проблемы с пакетом OSGi HttpClient, а также некоторые другие проблемы   с момента выпуска 4.3.5.

     

Обратите внимание, что с этого выпуска HttpClient отключает все версии   SSL (включая SSLv3) в пользу протокола TLS по умолчанию.   Те пользователи, которые хотят продолжать использовать SSLv3, должны явно   включите поддержку.

     

Пользователи всех версий HttpClient рекомендуется обновить.

     

Changelog:

     
  •   
  • Протокол SSLv3 по умолчанию отключен. Добавил Олег Кальничевский.  

Обновление: Если вы работаете на JVM с версией >= Java 1.8 Update 31 SSLv3 отключен по умолчанию. Проверьте примечания к выпуску

Ответ 4

Проведя значительное время, пытаясь понять, почему TLSv1.2 использовался, несмотря на установку -Dhttps.protocols = "TLSv1", мы, наконец, нашли это сообщение. Магический флаг действительно -Djdk.tls.client.protocols = "TLSv1", и наш клиент Apache Axis 1.4 работает снова. Поэтому, если вы перейдете с Java 7 на Java 8, вам может понадобиться добавить этот флаг, поскольку pre JAVA 8 использовал TLSv1 по умолчанию, тогда как JAVA 8 использует TLSv1.2

Спасибо!