【发布时间】: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