RestTemplate发送请求,配置HTTPS请求忽略SSL证书

导读:本篇文章讲解 RestTemplate发送请求,配置HTTPS请求忽略SSL证书,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、问题的出现

最近在使用RestTemplate发送请求的时候,出现了这样的一个问题:

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

通过搜索原因,发现是RestTemplate发送该https请求,需要附带上证书去请求(目前看应该是客户端单向的要求,不带也行,只需客户端配置,服务端不强求)。

解决方案:

1、在使用RestTemplate发送请求的时候,如果发送的是https请求,并且该请求需要证书认证时,那么就通过配置RestTemplate,忽略https证书认证,直接发送请求。

2、可以把证书下载下来,这种操作比较复杂,这里不做这种方法的描述。

二、前期准备

该项目是maven项目,由于配置RestTemplate的部分使用类来自于apache的一些jar包,在开始配置前先导入如下jar包:

<!--定制请求跳过ssl证书验证-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
        </dependency>
<!--定制请求跳过ssl证书验证-->

jar包版本根据需求选择。

三、RestTemplate配置

/**
 * RestTemplate配置类
 */
@Slf4j
@Configuration
public class RestTemplateConfig {

    /**
     * 忽略Https证书认证RestTemplate
     * @return unSSLRestTemplate
     */
    @Bean("unSSLRestTemplate")
    public RestTemplate unSSLRestTemplate() throws UnSSLRestTemplateCreateException {
        try{
            RestTemplate restTemplate = new RestTemplate(RestTemplateConfig.generateHttpRequestFactory());
            return restTemplate;
        }catch (Exception e){
            log.error(e.getMessage());
            throw new UnSSLRestTemplateCreateException("unSSLRestTemplate bean创建失败,原因为:" + e.getMessage());
        }
    }

    /**
     * 通过该工厂类创建的RestTemplate发送请求时,可忽略https证书认证
     * @return 工厂
     */
    private static HttpComponentsClientHttpRequestFactory generateHttpRequestFactory() throws Exception{
        TrustStrategy acceptingTrustStrategy = ((x509Certificates, authType) -> true);
        SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
        SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());

        HttpClientBuilder httpClientBuilder = HttpClients.custom();
        httpClientBuilder.setSSLSocketFactory(connectionSocketFactory);
        CloseableHttpClient httpClient = httpClientBuilder.build();
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setHttpClient(httpClient);
        return factory;
    }
}

四、参考博客

RestTemplate Https请求忽略SSL证书_CarsonJava的博客-CSDN博客_resttemplate忽略ssl证书@Configurationpublic class RestTemplateProxy { @Autowired private RestTemplate restTemplate; @Autowired @LoadBalanced private RestTemplate lbRestTemplate; @Autowired private AsyncRestTemplate asyncRestTemplate; @Autowi.RestTemplate发送请求,配置HTTPS请求忽略SSL证书https://blog.csdn.net/Carson073/article/details/107556662

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99689.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!