springboot,springboot 使用restTemplate 發送https請求 忽略ssl證書

 2023-10-20 阅读 31 评论 0

摘要:最近在寫接口的時候給對方回推數據,發送https請求的時候遇到這么個報錯:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable

最近在寫接口的時候給對方回推數據,發送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 targetHTTPS經由超文本傳輸協議(HTTP)進行通信,但利用SSL/TLS來加密數據包,這里遇到的問題就是這個安全證書缺少產生的,所以,為了解決這個問題,一般有良好總方法,第一種是將對方網站的證書提前下到本地導入,這里的場景不大適合這個方式,所以采用第二種方式,忽略ssl證書的方法:

具體步驟大致有3步,首先添加一個RestTemplateConfig配置文件,源碼如下:

package com.config;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.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory factory){return new RestTemplate(factory);}@Beanpublic ClientHttpRequestFactory simpleClientHttpRequestFactory(){HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();factory.setConnectTimeout(15000);factory.setReadTimeout(5000);return factory;}public static HttpComponentsClientHttpRequestFactory generateHttpRequestFactory()throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException{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類:

RestTemplate restTemplate = new RestTemplate(RestTemplateConfig.generateHttpRequestFactory());

第三步便可以將發送信息寫進代碼中發送請求了

RestTemplate restTemplate = new RestTemplate(RestTemplateConfig.generateHttpRequestFactory());MultiValueMap<String, Object> headers = new LinkedMultiValueMap<String, Object>();headers.add("Accept", "*/*");headers.add("Content-Type", "application/json");String requestBody = "{\"returnData\":\"" + str + "\"}";System.out.println(str);HttpEntity entity = new HttpEntity(requestBody, headers);ResponseEntity<String> responseEntity=restTemplate.postForEntity("https://****",entity,String.class);//獲取返回結果String result= responseEntity.getBody();

?工作之余借機記錄一下。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/151607.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息