当前位置: 首页 > 知识库问答 >
问题:

如何在apache HttpClient上设置TLS版本

穆智刚
2023-03-14

如何更改我的HttpClient上支持的TLS版本?

我正在做:

SSLContext sslContext = SSLContext.getInstance("TLSv1.1");
sslContext.init(
    keymanagers.toArray(new KeyManager[keymanagers.size()]),
    null,
    null);

SSLSocketFactory socketFactory = new SSLSocketFactory(sslContext, new String[]{"TLSv1.1"}, null, null);
Scheme scheme = new Scheme("https", 443, socketFactory);
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(scheme);
BasicClientConnectionManager cm = new BasicClientConnectionManager(schemeRegistry);
httpClient = new DefaultHttpClient(cm);

但是当我检查创建的套接字时,它仍然说支持的协议是TLSv1.0、TLSv1.1和TLSv1.2。

事实上,我只是希望它停止使用TLSv1.2,对于这个特定的HttpClient。

共有3个答案

广献
2023-03-14

HttpClient-4.5,使用TLSv1。2、您必须这样编码:

 //Set the https use TLSv1.2
private static Registry<ConnectionSocketFactory> getRegistry() throws KeyManagementException, NoSuchAlgorithmException {
    SSLContext sslContext = SSLContexts.custom().build();
    SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
            new String[]{"TLSv1.2"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier());
    return RegistryBuilder.<ConnectionSocketFactory>create()
            .register("http", PlainConnectionSocketFactory.getSocketFactory())
            .register("https", sslConnectionSocketFactory)
            .build();
}

public static void main(String... args) {
    try {
        //Set the https use TLSv1.2
        PoolingHttpClientConnectionManager clientConnectionManager = new PoolingHttpClientConnectionManager(getRegistry());
        clientConnectionManager.setMaxTotal(100);
        clientConnectionManager.setDefaultMaxPerRoute(20);
        HttpClient client = HttpClients.custom().setConnectionManager(clientConnectionManager).build();
        //Then you can do : client.execute(HttpGet or HttpPost);
    } catch (KeyManagementException | NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
}
方苗宣
2023-03-14

这就是我如何让它在http客户端4.5上工作(根据橄榄树请求):

CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
        new AuthScope(AuthScope.ANY_HOST, 443),
        new UsernamePasswordCredentials(this.user, this.password));

SSLContext sslContext = SSLContexts.createDefault();

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,
        new String[]{"TLSv1", "TLSv1.1"},
        null,
        new NoopHostnameVerifier());

CloseableHttpClient httpclient = HttpClients.custom()
        .setDefaultCredentialsProvider(credsProvider)
        .setSSLSocketFactory(sslsf)
        .build();

return httpclient;
贡念
2023-03-14

解决办法是:

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

SSLConnectionSocketFactory f = new SSLConnectionSocketFactory(
    sslContext,
    new String[]{"TLSv1", "TLSv1.1"},   
    null,
    BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);

httpClient = HttpClients.custom()
    .setSSLSocketFactory(f)
    .build();

这需要org.apache.httpcomponents.httpclient4.3. x虽然。

 类似资料:
  • 问题内容: 如何在HttpClient上更改受支持的TLS版本? 我正在做: 但是当我检查创建的套接字时,它仍然说支持的协议是TLSv1.0,TLSv1.1和TLSv1.2。 实际上,我只希望它针对此特定HttpClient停止使用TLSv1.2。 问题答案: 解决方案是: 不过,这需要org.apache.httpcomponents.httpclient4.3.x。

  • 我在一个软件应用程序上工作,该应用程序使用gRPC在客户端和服务器之间建立双向流。 我正在寻找类似于这张票的答案的东西,只在java中:如何为gRPC启用服务器端SSL? 我想配置我的应用程序,以便他们可以选择他们想要使用的TLS场景: 场景1:明文(无加密) 场景2:服务器端TLS 场景3:共同TLS 对于TLS设置,我在非Android环境中使用Java,因此我只考虑使用https://git

  • 问题内容: 我使用RSA建立SSL我的春节,引导服务器(如何配置SSL /HTTPS的春天?通过以下)的指导: 使用创建了一个新的密钥库和密钥 将这些行放在我的application.properties文件中: 奇迹般有效。但是,当我通过运行生成AES 256密钥并将.properties文件更改为新的密钥存储区/密钥值时,对服务器的每个请求均导致。我应该遵循什么步骤来成功配置它? 问题答案:

  • 我有一个windows窗体应用程序,它是通过单击一次来部署的。该应用程序是用。net 4.7.2,它使用HttpClient API访问托管在内部服务器上的两个rest web服务。正如您所料,这些服务只能通过HTTPS访问,并且服务器配置为支持所有TLS版本(顺便说一句,这是2016 windows服务器)。 intranet客户端应用程序(即windows forms应用程序)部署在多个内部子

  • 我遵循每一个步骤来设置新的版本。 我已经有了,为了更新,我下载了 ....现在当我运行Android Studio时,它说: 错误:配置根项目“empty”时出现问题。 未能解析配置“:classpath”的所有依赖项。找不到com.android.tools.build:gradle:4.1。在以下位置搜索:文件:/c:/程序文件/android/android Studio1/gradle/m

  • 但在Wire shark软件中,我们看到客户端只在TLSV1中与服务器进行对话。 参考链接:https://superuser.com/questions/747377/enable-tls-1-1-and-1-2-for-clients-on-java-7 在和中。但仍然在Wire shark软件中,我们看到客户端只在TLSV1中与服务器进行对话。 谁能告诉我们如何在客户端和服务器上执行TLS1

  • 问题内容: 有没有办法将CentOS 7上的Python 3.5.2设置为默认的Python版本?目前,我已经默认安装了Python 2.7和Python 3.5.2。 我使用了以下命令 但是之后给出了错误。 问题答案: 如果这 不起作用(应该) 您可以使用以下命令在您的计算机中添加一个别名: 如果这不起作用,则应该只使用虚拟环境。阅读此页以开始使用。

  • 我的项目使用Android Volley网络框架已经很久了,但是最近我发现了一个发布在互联网上的SSL 3.0协议bug。 我想知道如何找出我的项目使用的TLS版本,以及如何确认库是否更新。 这是我的源代码片段: 我认为重点是HurlStack类,它取决于包,但是我不知道TLS/SSL配置在哪里。