【问题标题】:How do I force Apache's CloseableHttpClient to use TLSv1.2?如何强制 Apache 的 CloseableHttpClient 使用 TLSv1.2?
【发布时间】:2019-12-07 03:51:54
【问题描述】:

在 Java 中,我需要让 Apache CloseableHttpClient 使用 TLSv1.2。目前它看起来像使用 HTTP/1.1。如何在下面的代码中指定协议版本?

 public static void main(String [] args){
                                try {
                      SSLContext sslContext = SSLContext.getInstance("TLS");
                                  @SuppressWarnings("static-access")
                                  CloseableHttpClient httpclient = HttpClientBuilder.create()
                                    .setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext.getDefault(), new String[] { "TLSv1.2" }, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier()))
                                    .build();
                      HttpHost target = new HttpHost("https://www.sometest.com", 443, "https");
                      String call = "/vivisimo/cgi-bin/velocity";
                      HttpGet getRequest = new HttpGet(call);
                      System.out.println("Protocol Version:" + getRequest.getProtocolVersion());
                     } catch (Exception e) {
                      e.printStackTrace();
                                  }
}

【问题讨论】:

  • 你了解TLS和HTTP的区别吗?
  • @JoshuaHedges 请检查添加到答案中的运行代码,以演示如何强制使用特定的 TLS 版本。

标签: java apache ssl tls1.2


【解决方案1】:

在创建 SSLContext 时指定它必须使用 TLS 而不是获取默认的:

SSLContext sslContext = SSLContextBuilder.create().build();

或者:

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(....);

或者干脆使用:

SSLContext sslContext = SSLContexts.custom().build()

根据您的代码,这里是运行示例(它连接到google.com)。我已启用调试日志。在日志中查找negotiated protocol: TLSv1.2。现在,在创建 http 客户端(new String[] { "TLSv1.1" })时将TLS 版本更改为1.1,运行程序并观察字符串“协商协议..”更改为TLSv1.1。 您之前打印的是 HTTP 协议版本。

import org.apache.http.HttpHost;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.SSLContexts;

import javax.net.ssl.SSLContext;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.StringWriter;

public class ForceTLS12 {
    public static void main(String[] args) {
        try {
            System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog");
            System.setProperty("org.apache.commons.logging.simplelog.showdatetime","true");
            System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http","DEBUG");
            System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.wire","DEBUG");
            //SSLContext sslContext = SSLContext.getInstance("TLS");
            @SuppressWarnings("static-access")
            CloseableHttpClient httpclient = HttpClientBuilder.create()
                    .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom().build(), new String[] { "TLSv1.2" }, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier()))
                    .build();
            HttpHost target = new HttpHost("www.google.com", 443, "https");
            //String call = "/vivisimo/cgi-bin/velocity";
            HttpGet getRequest = new HttpGet(target.toURI());
            CloseableHttpResponse resposne = httpclient.execute(getRequest);

            System.out.println(resposne.getEntity().getContentType());
            System.out.println("Protocol Version:" + getRequest.getProtocolVersion());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

此可执行代码示例也可在 github 获得。

【讨论】:

  • 我添加了 SSLContext sslContext = SSLContext.getInstance("TLS");在此代码的开头,将注释代码移出并替换上面的第一行。我还在该行中引用了 sslContext 变量而不是 SSLContext。由于某种原因它仍然无法正常工作。
  • 不,它仍然是 HTTP 1.1
  • 您能否编辑问题以反映您当前的代码并使其成为可运行的代码。
  • 我对其进行了更新,因此它不会进行调用,但它应该打印出协议。我假设 getRequest.getProtocolVersion() 将打印出 TLS。
  • 我添加了启用调试日志的完整运行代码。看看这个,让我知道你的问题是否解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2016-05-03
相关资源
最近更新 更多