当前位置: 首页 > news >正文

HttpClient请求Https证书问题解决

本地使用HttpClient请求https时没有问题,但是放到服务器上,运行出现报错,出现异常为:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

通过查阅网上资料,将解决方案整如下:

1.通过在服务器端安装证书

步骤:
1.现在指定的https链接下载证书,保存为.cer文件
2.双击.cer文件安装即可

但是,在按照以上步骤使用时,还是会出现异常,这里又通过查阅资料,了解到java的jdk用于自己的证书库,在使用时,需要将证书安装到jdk默认的证书库中,这里步骤大致如下:
1.进入jdk–>jre–>lib–>security目录下
2.cmd,并执行以下命令

keytool -import -alias kdcert -file E:\cert\kd.cert.cer -keystore cacerts -trustcacerts

alias :证书别名,用于查询证书
file :证书所在路径
-keystore cacerts -trustcacerts:固定写法

这种方法原则上是可行的,但是由于我的服务器不能装JDK环境,只能通过指定jre的方式运行jar包,而通过这种方式必须制定到jdk安装目录,这种方式因此也不考虑了

2.在代码段添加信任所有证书

这里采用在发送https请求前,对https证书进行全部信任,代码如下,亲测有效。

package com.focusmedis.FIM.communication;

import com.focusmedis.FIM.utils.JsonUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
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.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.ibatis.mapping.ResultMap;
import org.springframework.stereotype.Service;

import javax.net.ssl.SSLContext;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class HttpSend {

    private static CloseableHttpClient httpClient;

    /**
     * 信任SSL证书
     */
    static {
        try {
            SSLContext sslContext = SSLContextBuilder.create().useProtocol(SSLConnectionSocketFactory.SSL).loadTrustMaterial((x, y) -> true).build();
            RequestConfig config = RequestConfig.custom().setConnectTimeout(5000).setSocketTimeout(5000).build();
            httpClient = HttpClientBuilder.create().setDefaultRequestConfig(config).setSSLContext(sslContext).setSSLHostnameVerifier((x, y) -> true).build();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * post请求
     * @param url
     * @param params
     * @return
     */
    public static String doPost(String url, Map<String, String> params) {
        if (StringUtils.isBlank(url)) {
            return null;
        }
        try {
            List<NameValuePair> pairs = null;
            if (params != null && !params.isEmpty()) {
                pairs = new ArrayList<>(params.size());
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    String value = entry.getValue();
                    if (value != null) {
                        pairs.add(new BasicNameValuePair(entry.getKey(), value));
                    }
                }
            }
            HttpPost httpPost = new HttpPost(url);
            if (pairs != null && pairs.size() > 0) {
                httpPost.setEntity(new UrlEncodedFormEntity(pairs, "utf-8"));
            }
            CloseableHttpResponse response = httpClient.execute(httpPost);
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode != 200) {
                httpPost.abort();
                throw new RuntimeException("HttpClient is error status code :"
                        + statusCode);
            }
            HttpEntity entity = response.getEntity();
            String result = null;
            if (entity != null) {
                result = EntityUtils.toString(entity, "utf-8");
            }
            EntityUtils.consume(entity);
            response.close();
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * post请求 发送json格式的报文 StringEntity
     * @param url
     * @param jsonString
     * @return
     */
    public static Map<String,Object> doPost(String url, String jsonString) {
        Map<String,Object> resultMap = new HashMap<>();
        if (StringUtils.isBlank(url)) {
            return null;
        }
        try {
            HttpPost httpPost = new HttpPost(url);
            StringEntity stringEntity = new StringEntity(jsonString, "utf-8");
            stringEntity.setContentType("application/json");
            httpPost.setEntity(stringEntity);

            //这里新增对进得请求头的判断
            Map<String, Object> datamap = JsonUtils.JsonToMapObj(jsonString);
            if (datamap.containsKey("api")) {
                String api = (String) datamap.get("api");
                httpPost.setHeader("api", api);
            }

            if (datamap.containsKey("accessTokenStr")) {
                String accessTokenStr = (String) datamap.get("accessTokenStr");
                httpPost.setHeader("accessToken", accessTokenStr);
            }

            CloseableHttpResponse response = httpClient.execute(httpPost);
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode != 200) {
                httpPost.abort();
                throw new RuntimeException("HttpClient is error status code :"
                        + statusCode);
            }
            HttpEntity entity = response.getEntity();

            String result = null;
            if (entity != null) {
                result = EntityUtils.toString(entity, "utf-8");

                resultMap.put("statuscode", Integer.toString(statusCode));
                resultMap.put("conResult",result);
            }
            EntityUtils.consume(entity);
            response.close();
            return resultMap;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

相关文章:

  • springcloud中使用ribbon实现负载均衡报错问题
  • Spring基础
  • Spring创建对象的几种方式
  • Java服务后台启动问题总结
  • springboot自定义starter并上传至公网调用
  • 正向代理、反向代理、负载均衡
  • 64位linux编译32位程序
  • Python tips: 什么是*args和**kwargs?
  • 关于SAP UI5数据绑定我的一些原创内容
  • 安卓微信视频最佳实践
  • 触摸事件分发核心机制优化吸收
  • 异常机制详解
  • oracle 10g 搭建备库以及一次DG GAP的处理情况
  • 智能分析---表格的智能洞察
  • 线性代数学习
  • 自己简单写的 事件订阅机制
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2017 年终总结 —— 在路上
  • Date型的使用
  • echarts花样作死的坑
  • Fastjson的基本使用方法大全
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JS基础之数据类型、对象、原型、原型链、继承
  • leetcode98. Validate Binary Search Tree
  • Python 基础起步 (十) 什么叫函数?
  • python_bomb----数据类型总结
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue全家桶实现一个Web App
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 简析gRPC client 连接管理
  • 判断客户端类型,Android,iOS,PC
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 1.Ext JS 建立web开发工程
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​虚拟化系列介绍(十)
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • $.ajax中的eval及dataType
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)项目管理杂谈-我所期望的新人
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net反混淆脱壳工具de4dot的使用
  • @ComponentScan比较
  • [ IO.File ] FileSystemWatcher
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [bzoj4240] 有趣的家庭菜园
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符
  • [ERROR]-Error: failure: repodata/filelists.xml.gz from addons: [Errno 256] No more mirrors to try.
  • [go] 策略模式
  • [HXPCTF 2021]includer‘s revenge