java通过HttpClient方式实现https请求的工具类(绕过证书验证)

目录

一、引入依赖包

  • 引入相关依赖包

    java 复制代码
     <!--lombok用于简化实体类开发-->
     <dependency>
         <groupId>org.projectlombok</groupId>
         <artifactId>lombok</artifactId>
         <optional>true</optional>
     </dependency>
     <!--fastjson依赖-->
     <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>fastjson</artifactId>
         <version>2.0.32</version>
     </dependency>
     <!--httpclient依赖-->
      <dependency>
        <groupId>org.apache.httpcomponents</groupId>
         <artifactId>httpclient</artifactId>
         <version>4.5.2</version>
      </dependency>

二、HttpClient方式实现的https请求工具类

  • https工具类代码

    java 复制代码
    package com.xz.https;
    
    import com.alibaba.fastjson.JSONObject;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.http.HttpEntity;
    import org.apache.http.ParseException;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.config.Registry;
    import org.apache.http.config.RegistryBuilder;
    import org.apache.http.conn.socket.ConnectionSocketFactory;
    import org.apache.http.conn.socket.PlainConnectionSocketFactory;
    import org.apache.http.conn.ssl.NoopHostnameVerifier;
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.apache.http.util.EntityUtils;
    import org.springframework.core.io.ClassPathResource;
    
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.TrustManagerFactory;
    import javax.net.ssl.X509TrustManager;
    import java.io.IOException;
    import java.security.KeyManagementException;
    import java.security.KeyStore;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.cert.Certificate;
    import java.security.cert.CertificateException;
    import java.security.cert.CertificateFactory;
    import java.security.cert.X509Certificate;
    
    
    /**
     * @Description HttpClient方式的 https工具类
     * @author xz
     */
    @Slf4j
    public class HttpsUtil {
    
        public static String post(String url, JSONObject content) throws Exception {
            String returnInfo = "";
            CloseableHttpResponse response = null;
            //getTrust():进行证书验证;allTrust:绕过证书验证
            PoolingHttpClientConnectionManager connectionManager = allTrust();
            try (CloseableHttpClient client = HttpClients.custom().setConnectionManager(connectionManager).build()) {
                HttpPost post = new HttpPost(url);
                //指定报文头
                post.setHeader("Context-Type", "application/json;charset=UTF-8");
                //设置entity
                StringEntity entity = new StringEntity(JSONObject.toJSONString(content), "UTF-8");
                entity.setContentType("application/json");
                post.setEntity(entity);
                //发送请求
                response = client.execute(post);
                log.info("response->:{}", response);
                HttpEntity resEntity = response.getEntity();
                if (resEntity != null) {
                    returnInfo = EntityUtils.toString(resEntity, "UTF-8");
                }
                EntityUtils.consume(resEntity);
                response.close();
                return returnInfo;
            } catch (IOException | ParseException e) {
                log.info("errorLogs->:{}", e);
                return returnInfo;
            }
    
        }
    
        /**
         * 绕过验证
         * @author xz
         */
        public static PoolingHttpClientConnectionManager allTrust() {
            SSLContext sslContext = null;
    
            PoolingHttpClientConnectionManager connectionManager = null;
            try {
                sslContext = SSLContext.getInstance("TLSv1.2");
                X509TrustManager trustManager = new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    
                    }
    
                    @Override
                    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    
                    }
    
                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return new X509Certificate[0];
                    }
                };
                sslContext.init(null, new TrustManager[]{trustManager}, null);
    
                //设置http和https对应处理socket链接工厂的对象
                Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                        .register("http", PlainConnectionSocketFactory.INSTANCE)
                        .register("https", new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE))
                        .build();
                connectionManager = new PoolingHttpClientConnectionManager(registry);
            } catch (NoSuchAlgorithmException | KeyManagementException e) {
                log.info("errorLogs->:{}", e);
            }
    
            return connectionManager;
        }
    
        /**
         * 进行证书验证
         * @author xz
         */
        public static PoolingHttpClientConnectionManager getTrust() {
            PoolingHttpClientConnectionManager connectionManager = null;
            try {
                CertificateFactory certificateFactory = CertificateFactory.getInstance("x.509");
                //证书路径
                ClassPathResource classPathResource = new ClassPathResource("xxxx.pem");
                Certificate certificate = certificateFactory.generateCertificate(classPathResource.getInputStream());
                //creat TrustStore
                KeyStore keyStore = KeyStore.getInstance("JKS");
                keyStore.load(null ,null);
                //Add certificate
                keyStore.setCertificateEntry("key",certificate);
                TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                trustManagerFactory.init(keyStore);
                //creatSSlContext
                SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
                sslContext.init(null,trustManagerFactory.getTrustManagers(),null);
                //设置http和https对应处理socket链接工厂的对象
                Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                        .register("http", PlainConnectionSocketFactory.INSTANCE)
                        .register("https", new SSLConnectionSocketFactory(sslContext))
                        .build();
                connectionManager = new PoolingHttpClientConnectionManager(registry);
            } catch (CertificateException | IOException | KeyStoreException | NoSuchAlgorithmException | KeyManagementException e) {
                log.info("errorLogs->:{}", e);
            }
    
            return connectionManager;
        }
    
    }

三、测试类

  • 测试代码

    java 复制代码
    package com.xz.https;
    
    import com.alibaba.fastjson.JSONObject;
    
    /**
     * @author: xz
     * @since: 2024/1/11 22:17
     * @description:
     */
    public class HttpsUtilsTest {
        public static void main(String[] args) throws Exception {
            String url="https://xxx.com.cn:5678/gateway/user/service/getxxxx";
            UserReq userReq = new UserReq ();
            userReq .setName("张三");
            JSONObject parse = (JSONObject)JSONObject.parse(JSONObject.toJSONString(userReq));
            String result = HttpsUtil.post(url, parse);
            System.out.println("HttpClient---https请求:"+result);
        }
    }
  • 测试输出结果

相关推荐
程序员的世界你不懂20 分钟前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
星空寻流年20 分钟前
设计模式第一章(建造者模式)
java·设计模式·建造者模式
gb42152871 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
曾经的三心草1 小时前
Python2-工具安装使用-anaconda-jupyter-PyCharm-Matplotlib
android·java·服务器
Metaphor6921 小时前
Java 高效处理 Word 文档:查找并替换文本的全面指南
java·经验分享·word
ChinaRainbowSea2 小时前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
stormsha2 小时前
飞算JavaAI炫技赛电商系统商品管理模块的架构设计与实现
java·架构·鸿蒙系统
minh_coo2 小时前
Spring框架事件驱动架构核心注解之@EventListener
java·后端·spring·架构·intellij-idea
翻滚丷大头鱼2 小时前
Java 集合Collection—List
java·开发语言
敲键盘的肥嘟嘟左卫门2 小时前
StringBuilder类的数据结构和扩容方式解读
java