项目场景:测试https发送获取数据
相关报错如下:
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
问题描述
一般出现这个问题需要首先排查你的请求是什么方式的:
http还是https?
可能是你把https的请求用http方式处理了,导致了这个错误。
如果确定是https请求,那么就是SSL证书检测导致的问题了。
解决方案:
我解决这个问题是用的忽略ssl检测:
使用一个SslUtil类对本次请求做SSL忽略;
也就是在创建HttpsURLConnection之前调用ignoreSsl()方法将其忽略掉。
public class SslUtil {
/**
* 忽略HTTPS请求的SSL证书
*/
public static void ignoreSsl() throws Exception {
HostnameVerifier hv = (urlHostName, session) -> {
return true;
};
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
private static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new TestSsl.TmXtm();
trustAllCerts[0] = tm;
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
static class TmXtm implements TrustManager, X509TrustManager {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(X509Certificate[] certs) {
return true;
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
}
}