【问题标题】:Java http clients and POODLEJava http 客户端和 POODLE
【发布时间】:2014-12-13 07:35:38
【问题描述】:

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

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

我正在寻找类似 @​​987654321@ 的东西,但适用于 Java 客户端。

【问题讨论】:

标签: java security https apache-httpclient-4.x poodle-attack


【解决方案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)。

【讨论】:

  • 谢谢 - 如果你知道的话,你愿意告诉我们 JRE 在 POODLE 攻击方面的表现吗?
  • @luksch Oracle 可能会在某个时候取消对 SSLv3 的支持,但现在需要确保禁用 SSL 协议,或者准确地说,TLS 是唯一启用的协议
  • 如果 SSLv3 是受支持的协议,但服务器支持更高版本(例如 TLSv1)和可用的密码套件,客户端将尝试使用更高版本。 POODLE 依赖于破坏握手并让客户端下拉到 SSLv3 来处理错误。据我了解,这不是协议本身指定的,而是浏览器所做的。 HttpClient 会降到 SSLv3 吗?
  • @ykaganovich 正如我所说,TLS 握手的细节完全不受 HttpClient 控制。但是,如果客户端已配置为仅允许 TLS 协议降级到 SSLv3 应该失败
  • 如果在构建时提供的配置失败,@ykaganovich HttpClient 不会尝试应用不同的 SSL 配置。我可以保证。如果无法使用给定的 SSLContext 建立 SSL 会话,则不会尝试绕过它
【解决方案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

【讨论】:

  • 感谢您提供指向 Oracle 官方指南的链接。 https.protocols 设置仅适用于 HttpsURLConnection。它不会阻止 Apache HttpClient 和其他实现配置支持 SSLv3 的 JSSE 上下文。
  • 为了保证@ykaganovich 评论的完整性,设置https.protocols 也不会影响可能创建的任何服务器套接字,除非它们已被明确编程以咨询https.protocols。例如,Apache Tomcat 会忽略 https.protocols,但您可以通过复杂的方式配置 Tomcat,包括挑选协议。
【解决方案3】:

Apache HttpClient 4.3.6 默认禁用 SSLv3。

这是Apache HC 4.3.6 release notes的摘录

发布 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 默认禁用。请查看release notes

【讨论】:

【解决方案4】:

在花费大量时间试图弄清楚为什么尽管设置了 -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

谢谢!

【讨论】:

    猜你喜欢
    • 2014-02-24
    • 1970-01-01
    • 2019-05-23
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    相关资源
    最近更新 更多