RestTemplate HTTPS请求忽略SSL证书
问题描述
使用RestTemplate发送HTTPS请求的时候,出现了这样的一个问题:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
RestTemplate 默认不支持https协议
解决方案:
第一种是忽略认证
第二种是导入证书,比较复杂(比第一种安全)
解决方案:
这里说一下第一种解决方案,忽略认证
RestTemplateConfig
package com.test.config;import java.nio.charset.Charset;
import java.util.List;import javax.net.ssl.SSLContext;import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.ssl.TrustStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig{@Bean("restTemplate")public RestTemplate RestTemplate() {HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();httpRequestFactory.setConnectionRequestTimeout(30000);httpRequestFactory.setConnectTimeout(30000);httpRequestFactory.setReadTimeout(30000);return new RestTemplate(httpRequestFactory);}/*** 用于https请求,忽略认证* @return unSSLRestTemplate*/@Bean("unSSLRestTemplate")public RestTemplate restTemplateHttps() {RestTemplate restTemplate = null;try {TrustStrategy acceptingTrustStrategy = (chain, authType) -> true;SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);HttpClientBuilder clientBuilder = HttpClients.custom();CloseableHttpClient httpClient = clientBuilder.setSSLSocketFactory(sslsf).build();HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();httpRequestFactory.setConnectionRequestTimeout(30000);httpRequestFactory.setConnectTimeout(30000);httpRequestFactory.setReadTimeout(30000);httpRequestFactory.setHttpClient(httpClient);restTemplate = new RestTemplate(httpRequestFactory);//解决乱码List<HttpMessageConverter<?>> httpMessageConverters = restTemplate.getMessageConverters();httpMessageConverters.stream().forEach(httpMessageConverter ->{if(httpMessageConverter instanceof StringHttpMessageConverter){StringHttpMessageConverter messageConverter = (StringHttpMessageConverter)httpMessageConverter;messageConverter.setDefaultCharset(Charset.forName("UTF-8"));}});} catch (Exception e) {e.printStackTrace();}return restTemplate;}
}
测试代码
package com.test.service;import javax.annotation.Resource;import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;/*** http请求&https请求*/
@Service
public class TestService {//http请求@Resource(name = "restTemplate")private RestTemplate restTemplate;//https请求@Resource(name = "unSSLRestTemplate")private RestTemplate unSSLRestTemplate;/*** http请求*/public void interfaceHttp(JSONObject params) {//参数String json = params.toJSONString();//请求头HttpHeaders headers = new HttpHeaders();headers.add("Content-Type", MediaType.APPLICATION_JSON_VALUE);HttpEntity<String> formEntity = new HttpEntity<String>(json, headers);restTemplate.postForObject(URL, formEntity, String.class);}/*** https请求*/public void interfaceHttps(JSONObject params) {//参数String json = params.toJSONString();//请求头HttpHeaders headers = new HttpHeaders();headers.add("Content-Type", MediaType.APPLICATION_JSON_VALUE);HttpEntity<String> formEntity = new HttpEntity<String>(json, headers);unSSLRestTemplate.postForObject(URL, formEntity, String.class);}
}
说明:这里兼容http和https请求,只需要指定名称即可
相关文章:
RestTemplate HTTPS请求忽略SSL证书
问题描述 使用RestTemplate发送HTTPS请求的时候,出现了这样的一个问题: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification …...
Jenkins触发器时间、次数设定
触发器触发条件介绍 触发器触发条件公式:由5颗星组成 * * * * * 分别代表:分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6) 企业项目中常用场景介绍 场景1:接口脚本部分测试通过,部分还在进行,回归测试脚本执行…...
kafka partition的数据文件(offffset,MessageSize,data)
partition中的每条Message包含了以下三个属性: offset,MessageSize,data,其中offset表示Message在这个partition中的偏移量,offset不是该Message在partition数据文件中的实际存储位置,而是逻辑上一个值&…...
htnl根据轮播图图片切换背景色
htnl根据轮播图图片切换背景色 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>轮播图示例</title><link rel"stylesheet" href"https://cdn.jsdelivr.net/npm/swiper10/swiper-bundle.min.css&q…...
gpu-manager安装及测试
提示:GPU-manager安装为主部分内容做了升级开箱即用,有用请点收藏❤抱拳 文章目录 前言一、约束条件二、使用步骤1.下载镜像1.1 查看当前虚拟机的驱动类型: 2.部署gpu-manager3.部署gpu-admission4.修改kube-scheduler.yaml