在上一篇文章里我们介绍了 httpclient 连接池的重试机制,在这里我们主要介绍连接池对于SSL的支持。
http连接的ssl支持
一般我们进行 http 请求的时候基本服务端都是 https 的,所以 httpclient 连接池也提供了ssl 的支持。那么对于 ssl 一般考虑如下两个项:
SSL证书的信任
HttpClientBuilder 在构建 httpclient 的时候有方法 setSSLContext() 可以设置 ssl context 上下文对象,而在该对象里可以设置证书的信任策略管理对象 TrustManager ,不设置则为 java 默认 ssl 证书信任策略。如下代码举例自定义信任策略为信任所有证书(生产环境勿用):
public class TrustAllManager implements X509TrustManager{
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
//Empty implementation here
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
//Empty implementation here
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[] {};
}
}
SSLContext sslcontext = SSLContext.getInstance("SSL");
sslcontext.init(null, new TrustManager[]{new TrustAllManager()}, new java.security.SecureRandom());
CloseableHttpClient htttpClient = HttpClients.custom().setSSLContext(sslContext).build();
SSL证书中CN host name的验证
HttpClientBuilder 在构建 httpclient 的时候有方法 setSSLHostnameVerifier 设置 HostnameVerifier 对象实例来完成 https 证书中 CN host name 的验证,默认不设置是需要验证证书中的 CN 。如下代码举例自定义验证策略为永远通过(生产环境勿用):
public class NoopHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(final String s, final SSLSession sslSession) {
return true;
}
@Override
public final String toString() {
return "NO_OP";
}
}
HostnameVerifier hostNameVerifier = new NoopHostnameVerifier();
CloseableHttpClient htttpClient = HttpClients.custom().setSSLHostnameVerifier(hostNameVerifier).build();
目前先写到这里,在下一篇文章里我们开始介绍 http 连接池中的长连接。