【问题标题】:How to add support for deprecated SSL cipher suites with Apache HttpClient 4如何使用 Apache HttpClient 4 添加对已弃用的 SSL 密码套件的支持
【发布时间】:2016-06-17 16:05:53
【问题描述】:

问题

所以,我需要使用旧的、已弃用的证书连接到该服务器。如果我尝试使用Apache HttpClient 连接到它,我会得到SSLException: Received fatal alert: close_notify。客户端本身不需要可被其他服务器重用,但构建器代码必须能够。

我不太理想的解决方法

我通过设置回退 TLS 协议解决了这个问题,但这并不理想,因为它添加了另一个请求。一定有比这更优雅的方式:

URL url = new URL("https://...");
SSLContextBuilder sslContextBuilder = SSLContexts.custom();
try {
    url.openConnection().connect();
} catch (SSLException e) {
    sslContextBuilder.useProtocol("TLSv1");
}

我也试过了

我也尝试过创建自定义SSLConnectionSocketFactory,但如果包含TLSv1.2 作为选项,apache 会忽略TLSv1

SSLConnectionSocketFactory sf = new SSLConnectionSocketFactory(
        SSLContext.getDefault(),
        new String[] { "TLSv1.2", "TLSv1" },
        null,
        SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);

反思

本质上,我认为基本问题是远程服务器使用了已弃用的密码套件。我可以将我想要支持的所有密码套件传递到 SSLConnectionSocketFactory,但是有很多,而且 Sun 已经隐藏了私有课程后面的完整列表。

【问题讨论】:

  • 你能列出那个服务器吗?例如ex.qq.com 。您可以在 ssllabs.com 上试用,看看它支持哪些 SSL 版本和密码套件。
  • 下定决心。它是已弃用的证书还是已弃用的密码套件?

标签: java ssl apache-httpclient-4.x tls1.2


【解决方案1】:

您可以通过删除 $JAVA_HOME/jre/lib/security/java.security 中的 jdk.tls.disabledAlgorithms 来使用已弃用的密码套件(例如 SSL_RSA_WITH_RC4_128_SHA)。

例如默认 HttpClient 访问的 https://ex.qq.com/ 将返回 Received fatal alert: handshake_failure。但是下面的代码可以工作:

public static void main(String[] args) throws Exception {
    HttpClientBuilder builder = HttpClientBuilder.create().
            setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContext.getDefault(),
            new String[] {"TLSv1"}, new String[] {"SSL_RSA_WITH_RC4_128_SHA"}, new DefaultHostnameVerifier()));
    try (CloseableHttpClient client = builder.build()) {
        HttpGet get = new HttpGet("https://ex.qq.com/");
        System.out.println(client.execute(get).getStatusLine().getStatusCode());
    }
}

查看这个问题了解更多详情:Received fatal alert: handshake_failure through SSLHandshakeException

【讨论】:

  • 我担心修改JDK安装对我的情况来说不是一个好的解决方案。这个应用程序运行在一个容器化的服务上,所以如果不是不可能的话,修改 JDK 是不受欢迎的。至于您的其他建议,那不是仅适用于该单一协议和密码吗?它看起来不能正确处理其他协议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
相关资源
最近更新 更多