Spring Boot项目中使用RestTemplate调用https接口出现 unable to find valid certification path to requested target
·
问题描述:Spring Boot项目中使用RestTemplate调用https接口出现以下错误:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
解决方法:出现上述问题的原因就是Java自带的安全证书不受信任,在代码里面的实现方式为在构建restTemplate时忽略证书,绕开SSL验证
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.ssl.SSLContextBuilder;
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;
@Slf4j
public class RestTemplateUtil {
public static RestTemplate getRestTemplate(int timeOut){
ClientHttpRequestFactory requestFactory = null;
try {
requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient(timeOut));
} catch (Exception e) {
log.info("RestTemplateConfig 出现异常:",e);
}
return new RestTemplate(requestFactory);
}
/**
* 绕过ssl 验证
*/
private static org.apache.http.client.HttpClient httpClient(int timeOut) throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(timeOut) // 服务器返回数据(response)的时间,超时抛出read timeout
.setConnectTimeout(timeOut) // 连接上服务器(握手成功)的时间,超时抛出connect timeout
.setConnectionRequestTimeout(timeOut)// 从连接池中获取连接的超时时间,超时抛出ConnectionPoolTimeoutException
.build();
SSLContext sslContext = SSLContextBuilder.create().setProtocol(SSLConnectionSocketFactory.SSL).loadTrustMaterial((x, y) -> true).build();
return HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).setSSLContext(sslContext).setSSLHostnameVerifier((x, y) -> true).build();
}
}
在代码中使用静态方法的形式去调用RestTemplate即可
HttpHeaders headers = new HttpHeaders();
headers.set("xxx", "123");
headers.set("xxx","456");
headers.set("Content-Type","text/plain");
HttpEntity<String> body = new HttpEntity<>("请求体字符串", headers);
ResponseEntity<String> response =RestTemplateUtil.getRestTemplate(timeout).postForEntity(sendUrl, body, String.class);
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)