16

关于 POODLE 漏洞,如果我理解正确的话,它需要一个客户端在无法与使用服务器发布的更高版本协议的服务器建立安全通道时自动将 TLS 协议降级到 SSLv3。

当无法与服务器建立 TLS 会话时,常见的 java HTTP 客户端库,特别是 javax.net.ssl.HttpsURLConnection 和 Apache HttpClient,是否会自动降级 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 协议方面。它依靠 JSSE API 来进行 TLS/SSL 握手并建立安全的 SSL 会话。除了 SSL 主机名验证逻辑,就 TLS/SSL 而言,Apache HttpClient 与运行它的 JRE 一样安全(或易受攻击)。


更新: HttpClient 4.3 默认始终使用 TLS,因此,除非明确将其配置为使用 SSLv3,否则 HttpClient不应容易受到基于 POODLE 的攻击

事实证明这是错误的。必须从支持的协议列表中明确删除 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 默认禁用所有版本的 SSL(包括 SSLv3)以支持 TLS 协议。那些希望继续使用 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,而 JAVA 8 使用 TLSv1.2

谢谢!

于 2015-02-09T15:39:16.647 回答