Java http客户端和POODLE

yka*_*ich 16 java security https apache-httpclient-4.x poodle-attack

关于POODLE漏洞,如果我理解正确,它需要客户端在未能与使用服务器通告的更高版本协议的服务器建立安全通道时自动将TLS协议降级为SSLv3.

常见的Java HTTP客户端库,特别是javax.net.ssl.HttpsURLConnection和Apache HttpClient,在无法与服务器建立TLS会话时会自动降级TLS协议吗?如果没有,我是否正确他们不受POODLE攻击的影响,除非(a)服务器仅支持SSLv3,或(b)更高级别的逻辑执行降级?

我正在寻找像http://blog.hagander.net/archives/222-A-few-short-notes-about-PostgreSQL-and-POODLE.html这样的东西,但是对于Java客户端.

ok2*_*k2c 22

Apache HttpClient不实现任何TLS协议方面.它依赖于JSSE API来进行TLS/SSL握手并建立安全的SSL会话.除了SSL主机名验证逻辑之外,就TLS/SSL而言,Apache HttpClient与其运行的JRE一样安全(或易受攻击).


更新: HttpClient的4.3默认情况下,总是使用TLS,因此,除非我们明确其配置为使用的SSLv3的HttpClient 应该不容易受到基于贵宾犬的攻击.

结果证明这是错误的.一个必须明确地从所支持的协议列表中删除的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();
Run Code Online (Sandbox Code Playgroud)

更新2:从版本4.3.6开始,HttpClient默认禁用所有版本的SSL(包括SSLv3).

  • @ykaganovich如果构造时提供的SSL配置失败,HttpClient不会尝试应用其他SSL配置.我可以保证.如果无法使用给定的SSLContext建立SSL会话,则不会尝试绕过该会话 (3认同)

小智 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

  • 感谢您链接到Oracle的官方指导.`https.protocols`设置仅适用于HttpsURLConnection.它不会阻止Apache HttpClient和其他实现配置支持SSLv3的JSSE上下文. (5认同)