网站建设4038gzs,广西建设人力资源网,大学生创新创业大赛策划书,昭通公司做网站1. 踩坑经历
最近做了个需求#xff0c;需要调用第三方接口获取数据#xff0c;在联调时一直失败#xff0c;代码抛出javax.net.ssl.SSLHandshakeException异常#xff0c;
具体错误信息如下所示#xff1a; javax.net.ssl.SSLHandshakeException: sun.security.validat…1. 踩坑经历
最近做了个需求需要调用第三方接口获取数据在联调时一直失败代码抛出javax.net.ssl.SSLHandshakeException异常
具体错误信息如下所示 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 target 2.原因分析
因为调用第三方接口的代码是复用项目中原有的工具类基于httpclient封装所以在确认完传参没问题后第一时间排除了编码问题。
然后开始怀疑第三方提供的接口地址因为竟然是IP端口访问在和第三方确认没有域名访问后在浏览器里输入第三方的接口地址发现证书有问题 又使用Postman调用第三方接口也是失败提示自签名证书 通过以上分析可以发现出现该问题的根本原因是Java客户端不信任目标服务器的SSL证书比如这个第三方使用的自签名证书。
3.解决方案
解决方案一般有2种第1种方案是将服务器证书导入Java信任库第2种方案是绕过SSL验证这里采用第2种方案。
首先新建HttpClient工具类
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.HttpClients;import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;public class HttpClientUtils {public static CloseableHttpClient createIgnoreCertClient() throws NoSuchAlgorithmException, KeyManagementException {SSLContext sslContext SSLContext.getInstance(SSL);sslContext.init(null, new TrustManager[]{new X509TrustManager() {Overridepublic X509Certificate[] getAcceptedIssuers() {return null;}Overridepublic void checkClientTrusted(X509Certificate[] certs, String authType) {}Overridepublic void checkServerTrusted(X509Certificate[] certs, String authType) {}}}, new java.security.SecureRandom());SSLConnectionSocketFactory sslConnectionSocketFactory new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);return HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build();}
}然后将原来声明httpClient的代码改为如下所示
CloseableHttpClient httpClient HttpClientUtils.createIgnoreCertClient();注意事项
确保项目中引入了httpclient依赖
dependencygroupIdorg.apache.httpcomponents/groupIdartifactIdhttpclient/artifactIdversion4.5.13/version
/dependency