HTTPClient发送Https请求

时间:2025-02-07 11:11:59

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