【问题标题】:useSystemProperties() is not working with Apache HttpClientBuilder.create() version 4.5.6useSystemProperties() 不适用于 Apache HttpClientBuilder.create() 版本 4.5.6
【发布时间】:2019-12-18 10:41:02
【问题描述】:

我有一个在 Vanilla Spring 4.2.5.RELEASE 和 JDK 1.7 上运行的项目,它使用 RestTemplate 和 PoolingHttpClientConnectionManager,我已经初始化客户端以使用系统属性

private HttpClient httpClient() {
        PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();
        poolingHttpClientConnectionManager.setMaxTotal(300);
        poolingHttpClientConnectionManager.setDefaultMaxPerRoute(200);
        return HttpClientBuilder
        .create()
        .useSystemProperties()
        .setConnectionManager(poolingHttpClientConnectionManager)
        .build();
}

并设置以下系统属性-Dhttps.protocols=TLSv1.2

我对这种行为一无所知,我尝试过像这样创建自定义 SSLConnectionSocketFactory 并且它有效

SSLConnectionSocketFactory sslConnectionSocketFactory =
            new SSLConnectionSocketFactory(SSLContexts.createDefault(),
                new String[]{"TLSv1.2"},
                null,
                SSLConnectionSocketFactory.getDefaultHostnameVerifier());

        PoolingHttpClientConnectionManager poolingHttpClientConnectionManager =
            new PoolingHttpClientConnectionManager(
                RegistryBuilder.<ConnectionSocketFactory>create()
                    .register("http", PlainConnectionSocketFactory.getSocketFactory())
                    .register("https", sslConnectionSocketFactory)
                    .build());

但我还有一个问题要解决,即 https 调用的 trustStore,此应用程序部署在 IBM WebSphere 中,由于 httpClient 没有使用 WebSphere 服务器设置的 systemProperties,我应该添加另一个代码 sn-p(指向 IBM TrustStore),我不想这样做,因为它的工作量太大,理想情况下 useSystemProperties() 应该可以解决这两个问题...

SSLContext sslContext = SSLContexts
                .custom()
                .loadKeyMaterial(ResourceUtils.getFile(keystoreLocation), null, keystorePassword.toCharArray())
                .loadTrustMaterial(ResourceUtils.getFile((truststoreLocation)), truststorePassword.toCharArray())
                .build();

请帮助如何继续...谢谢

【问题讨论】:

    标签: java spring websphere apache-httpclient-4.x resttemplate


    【解决方案1】:

    经过一些调试,我发现如果我们设置connectionManager,调用useSystemProperties()不会有任何影响,在.build()函数中,有一个if条件来检查connectionManager是否设置(参考图片下面),只有在没有设置的情况下,它才会使用systemProperties(因为指定连接管理器是对如何进行远程调用的低级自定义,我们应该在 PoolingHttpClientConnectionManager 初始化本身中设置它)

    PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new 
    PoolingHttpClientConnectionManager(RegistryBuilder
                .create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSystemSocketFactory())
                .build());
    

    SSLConnectionSocketFactory.getSystemSocketFactory()是最重要的

    【讨论】:

      猜你喜欢
      • 2020-04-01
      • 1970-01-01
      • 2018-09-05
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      相关资源
      最近更新 更多