【发布时间】:2019-08-16 05:50:08
【问题描述】:
我一直在尝试创建一个使用 Apache HttpClient 调用各种 RESTful Web 服务的客户端的 Apache 文档和其他示例。 (这些 Web 服务中的每一个都可能需要不同的客户端证书进行身份验证)。最初,我创建了一个初始化 HttpClient 的静态代码块(带有 SSLContext 信息和池连接管理器):
private static CloseableHttpClient _client;
static {
HttpClientBuilder clientBuilder = HttpClients.custom();
SSLContextBuilder sslContextBuilder = SSLContexts.custom();
sslContextBuilder.loadTrustMaterial(new TrustSelfSignedStrategy());
sslContextBuilder.loadKeyMaterial(new File("clientcert.p12"), password, password, (aliases, socket) -> aliases.keySet().iterator().next());
SSLContext sslContext = sslContextBuilder.build();
HostnameVerifier allowAllHosts = new NoopHostnameVerifier();
SSLConnectionSocketFactory connectionFactory = new SSLConnectionSocketFactory(sslContext, allowAllHosts);
clientBuilder.setSSLSocketFactory(connectionFactory);
RegistryBuilder<ConnectionSocketFactory> regBuilder = RegistryBuilder.<ConnectionSocketFactory>create();
regBuilder.register("https", connectionFactory);
regBuilder.register("http", new PlainConnectionSocketFactory());
Registry<ConnectionSocketFactory> socketFactoryRegistry = regBuilder.build();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
clientBuilder.setConnectionManager(connectionManager);
_client = clientBuilder.build();
}
此时我可以使用客户端执行请求,并且只要将服务器配置为允许访问 clientcert.p12,客户端身份验证就可以正常工作。
我需要的是能够根据所需客户端证书的值动态更改每个请求的客户端证书。
是否可以在动态更改客户端证书的同时重用静态 HttpClient?另外,如果可能的话,我是否还会看到使用池连接管理器的性能优势?
【问题讨论】:
标签: java apache-httpclient-4.x