Java http clients 和 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客户端。


答案 1

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)。


答案 2

如果使用 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