Java http 客户端和 POODLE

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

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

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

我正在寻找类似 http://blog.hagander.net/archives/222-A-few-short-notes-about-PostgreSQL-and-POODLE.html 的内容但对于 Java 客户端。

最佳答案

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


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

事实证明这是错误的。一个必须从支持的协议(protocol)列表中明确删除 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)。

关于Java http 客户端和 POODLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26429751/

相关文章:

Java - SonarQube,在 'Utility classes should not have public constructors' 上发布(squid :S1118) in singleton

java - 需要帮助从主图表打开子图表?

ios - 保护移动连接 - 存储 secret 和 key

asp-classic - asp-classic站点的注销功能

ssl - 让我们加密与 cloudflare 或两者兼而有之?

java - Hibernate继承,父类应该根据决策者是子类还是父类

java - 在 equals() 方法中分配字段

php - 将密码的 md5 散列存储在数据库中并进行比较

javascript - 如何使用 JavaScript 读取 HttpOnly cookie

ubuntu - 在 ubuntu 18.04.3 nginx 上设置 SSL