问题描述: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);

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐