Java http客户端和POODLE

关于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客户端。

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


更新: 默认情况下HttpClient 4.3总是使用TLS,因此,除非有人明确将其配置为使用SSLv3,否则HttpClient不应该容易受到基于POODLE的攻击

结果certificate这是错误的。 必须从支持的协议列表中明确删除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)。

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

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

更新:如果您在JVM上运行版本> = Java 1.8 Update 31默认情况下禁用SSLv3。请查看发行说明

尽管设置-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

谢谢!