Java应用程序需要使用自定义证书向服务器发出一些请求。操作系统包含给定服务器的另一个证书,无论是否添加自定义证书文件,它都没有区别。
流程类似于
AsyncHttpClientConfig asyncHttpClientConfig = new DefaultAsyncHttpClientConfig
.Builder()
.setMaxRequestRetry(1)
.setMaxConnections(1)
.setMaxConnectionsPerHost(1)
.setRequestTimeout(10000)
.setConnectTimeout(10000)
.setFollowRedirect(true)
.setSslContext(buildSslContext())
.build();
AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient(asyncHttpClientConfig);
String url = "www.example.com"
ListenableFuture<Response> res = asyncHttpClient.prepareGet(url).execute();
Response r = res.get();
System.out.println(r);
buildSslContext
方法是
private static SslContext buildSslContext() {
File pemFile = new File("/path/to/cert.pem");
try {
return SslContextBuilder.forClient().keyManager(pemFile, pemFile).build();
} catch (SSLException e) {
e.printStackTrace();
return null;
}
}
我还测试了curl
# curl -v www.example.com
# curl -v --cacert /path/to/cert.pem www.example.com
没有区别。但是,如果我确实删除了/etc/ssl/
的内容,它将根本无法访问服务器。
是否有可能通过async-http-client为给定服务器指定自定义证书,并将OS的默认证书用于其他服务器?我将2.8.0版用于异步HTTP客户端。