【httpClient忽略https的证书认证】

httpClient忽略https的证书认证

网络编程中,HTTPS(Hypertext Transfer Protocol Secure)是一种通过加密的方式在计算机网络上进行安全通信的协议。网络传输协议,跟http相比更安全,因为他加上了SSL/TLS协议来加密通信内容。

Java调用HTTPS,需要与客户端建立连接,但是建立连接的时候,需要进行SSL认证。有的时候为了方便调用,我们会绕过SSL认证。但是在特定环境中,绕过SSL认证是十分不安全的,不推荐这么做。SSL认证是确保通信安全的重要手段,绕过认证的话可能带来一系列的安全问题。
所以一般绕过SSL认证不在生产环境中使用。

httpClient工具类

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;

import org.activiti.engine.impl.util.json.JSONObject;
import org.activiti.engine.impl.util.json.XML;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.huiju.module.config.GlobalParameters;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
/**
     * @param url 请求接口地址
     * @param json 请求参数
     * @return
     */
    public static String  doPostForJson(String url, String json,String authorization,String ServiceName,String sourceSystem,String targetSystem) {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClientUtil.createSSLClientDefault();
        CloseableHttpResponse response = null;

        HttpEntity httpEntity = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            //httpPost.addHeader("Authorization",authorization);
            httpPost.addHeader("Connection","keep-alive");
            httpPost.addHeader("content-type", "application/json");
            httpPost.addHeader("Accept", "*/*");
            httpPost.addHeader("ServiceName",ServiceName);
            httpPost.addHeader("sourceSystem", sourceSystem);
            httpPost.addHeader("targetSystem", targetSystem);           
            
            // 创建请求内容
            StringEntity entity = new StringEntity(json,"utf-8");//解决中文乱码问题
            entity.setContentEncoding("UTF-8");
            entity.setContentType("application/json");
            httpPost.setEntity(entity);

            //4.设置请求和传输超时时间
            RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(20000).setConnectTimeout(20000).build();
            httpPost.setConfig(requestConfig);

            // 执行http请求
            response = httpClient.execute(httpPost);
            if(response != null) {
                httpEntity = response.getEntity();
                resultString = EntityUtils.toString(response.getEntity(), "utf-8");
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
            } catch (IOException e) {

                e.printStackTrace();
            }
        }

        return resultString;
    }
      
     
    // 创建自定义的 SSL 上下文,用于绕过证书验证
	public static CloseableHttpClient createSSLClientDefault() {
		try {
			SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
				// 信任所有证书
				public boolean isTrusted(X509Certificate[] arg0, String arg1)
						throws CertificateException {
					return true;
				}
			}).build();
			// 创建主机名验证器,用于绕过主机名验证
			HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
			// 创建 SSL 连接套接字工厂,将自定义的 SSL 上下文和主机名验证器应用于 HTTPS 连接
			SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
			// 创建自定义的 CloseableHttpClient 实例,将 SSL 连接套接字工厂应用于 HTTP 客户端
			return HttpClients.custom().setSSLSocketFactory(sslsf).build();
		} catch (KeyManagementException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		}
		return HttpClients.createDefault();
	}

该方法的实现逻辑如下:
创建一个自定义的 SSL 上下文(SSLContext),用于绕过 SSL 证书验证。
在 SSL 上下文中加载信任材料(TrustMaterial),并使用自定义的 TrustStrategy 来信任所有证书。
创建一个主机名验证器(HostnameVerifier),用于绕过主机名验证。使用NoopHostnameVerifier(主机名验证器)意味着在SSL连接中不会对服务器的主机名进行验证。主机名验证器用于验证SSL证书中的主机名与服务器实际的主机名是否匹配。NoopHostnameVerifier是一个空实现的主机名验证器,它绕过了主机名验证,即使主机名不匹配,也会继续进行SSL连接。
创建一个 SSL 连接套接字工厂(SSLConnectionSocketFactory),将自定义的 SSL 上下文和主机名验证器应用于 HTTPS 连接。创建自定义的SSL连接。有四种实现方式(指定SSL/TLS协议版本、指定加密算法和密码套件、自定义信任管理器、自定义主机名验证器),其中通过SSLConnectionSocketFactory指定自定义的主机名验证器(HostnameVerifier),以控制主机名验证的行为。
创建一个自定义的 CloseableHttpClient 实例,使用上述的 SSL 连接套接字工厂。
如果在创建 SSL 上下文时发生异常,将打印异常堆栈跟踪信息。
如果在创建 SSL 上下文时发生异常或抛出的异常类型无法识别,将返回默认的 CloseableHttpClient 实例。

调用HTTPS接口

//请求参数       
        Map<String,Object> map = new HashMap<>();            
        map.put("syscode","HXSRM"); 
        map.put("flowid","4cc9f210-d6d7-47a5-83c1-1ab52163f661");
        map.put("requestname","测试流程 001");    
        map.put("workflowname","测试流程名称 001");
        map.put("nodename","测试节点 001");
        map.put("pcurl","http://www.baidu.com");
        map.put("appurl","http://www.baidu.com");
        map.put("isremark","0");
        map.put("viewtype","0");
        map.put("creator","wld");
        map.put("createdatetime","2024-08-08 14:53:19");
        map.put("receiver","ziyangwang@bdstar.com");
        map.put("receivedatetime","2024-08-08 14:53:19");
        map.put("receivets","1723099999320");
        JSONObject json = (JSONObject) JSONObject.toJSON(map);
        String data = json.toString();
        String url = "https://192.168.0.188:8000/v2/httpapi/comm";
        //调用API,注意判断响应结果是否成功后再处理
        String resultData = HttpClientUtil.doPostForJson(url, data, null,"S002009001A","HXSRM","OA");
        log.info("resultData === " + resultData);
        Map resultMap = JSON.parseObject(resultData, Map.class);
        String operResult = resultMap.get("operResult").toString();   
        log.info("operResult === " + operResult);
        String message = null;
        if(resultMap.get("message") != null){
            message = resultMap.get("message").toString();
            log.info("message === " + message);
        }     

返回值:
resultData === {“syscode”:“HXSRM”,“operResult”:“1”,“dataType”:“WfData”,“operType”:“Check”,“message”:“接收流程数据【测试流程 001】,【xxx@xxstar.com】——接收人存在,接收待办成功”}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值