package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import .X509TrustManager;
import ;
import ;
import ;
import ;
import ;
import ;
public class HttpClientUtils {
public static void main(String[] args) {
try (CloseableHttpClient httpClient = getHttpsClient()) {
HttpPost httpPost = new HttpPost();
(httpPost);
} catch (Exception e) {
();
}
}
/**
* 获取一个HTTPS连接客户端 绕过SSL无参调用
*
* @return HttpClient
* @throws Exception 创建连接过程中可能出现的异常
*/
public static CloseableHttpClient getHttpsClient() throws Exception {
return getHttpsClient(null, null);
}
/**
* 获取一个HTTPS连接客户端
*
* @param fileName 证书文件名称 为空时创建跳过SSL
* @param password 证书秘钥 为空时创建跳过SSL
* @return HttpClient
* @throws Exception 创建连接过程中可能出现的异常
*/
public static CloseableHttpClient getHttpsClient(String fileName, String password) throws Exception {
SSLContext sslContext;
if ((fileName) || (password)) {
sslContext = createIgnoreVerifySSL();
} else {
sslContext = getSSLContext(fileName, password);
}
//设置协议http和https对应的处理socket链接工厂的对象
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", )
.register("https", new SSLConnectionSocketFactory(sslContext))
.build();
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
return ().setConnectionManager(connManager).build();
}
/**
* 绕过SSL验证 HttpClient 4. 版本之前可用,之后的版本默认支持https
*
* @return SSLContext
* @throws NoSuchAlgorithmException 找不到算法类型时抛出
* @throws KeyManagementException 秘钥错误时抛出
*/
public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {
//算法可更换
SSLContext sc = ("SSLv3");
// 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法
X509TrustManager trustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(
.X509Certificate[] paramArrayOfX509Certificate,
String paramString) {
}
@Override
public void checkServerTrusted(
.X509Certificate[] paramArrayOfX509Certificate,
String paramString) {
}
@Override
public .X509Certificate[] getAcceptedIssuers() {
return null;
}
};
(null, new TrustManager[]{trustManager}, null);
return sc;
}
/**
* 生产环境下读取证书文件并构建SSLContext
*
* @param fileName 证书文件路径及名称
* @param password 证书秘钥
* @return SSLContext
* @throws KeyStoreException 秘钥错误时抛出
* @throws NoSuchAlgorithmException 找不到算法类型时抛出
* @throws IOException 秘钥文件读取错误时抛出
* @throws CertificateException 证书错误时抛出
* @throws KeyManagementException 秘钥管理错误时抛出
*/
public static SSLContext getSSLContext(String fileName, String password) throws
KeyStoreException, NoSuchAlgorithmException,
IOException, CertificateException,
KeyManagementException {
//秘钥文件,秘钥
return ()
.loadTrustMaterial(new File(fileName), ())
.build();
}
}
参考两位大佬博文稍作整合,作为工具方法使用,在此记录:
HttpClient配置SSL绕过https证书_irokay的专栏-****博客_httpclient https
Apache HttpClient 的 HTTPS 调用实现_Defonds 的专栏-****博客_httpclient 访问https