简介
在一次使用Java进行网络通信的时候,出现了请求失败的问题,然后发现报错如下:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
就是我们的SSL证书不被信任,网上有一些解决方法就是重新生成一个新的SSL证书然后加入到secure目录下,但是这样太麻烦了。可以通过以下方法简单解决!
参考这位大佬的博客。但是他的方法有个地方现在不能用了,所以就改了一下,可以完美解决。
解决方案
1、首先创建一个类继承X509HostnameVerifier这个抽象类(或者直接在代码里面写个匿名类也可以),然后实现有返回值的那个verify函数,直接返回true即可,其他的空实现即可。如下:
X509HostnameVerifier hostnameVerifier = new X509HostnameVerifier() {
@Override
public void verify(String s, SSLSocket sslSocket) throws IOException {
}
@Override
public void verify(String s, X509Certificate x509Certificate) throws SSLException {
}
@Override
public void verify(String s, String[] strings, String[] strings1) throws SSLException {
}
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
};
然后作如下设置就可以了:
SSLContext sslContext = SSLContextBuilder.create().useProtocol(SSLConnectionSocketFactory.SSL).loadTrustMaterial((x, y) -> true).build();
RequestConfig config = RequestConfig.custom().setConnectTimeout(5000).setSocketTimeout(5000).build();
httpClient = HttpClientBuilder.create().setSslcontext(sslContext).setDefaultRequestConfig(config).setHostnameVerifier(hostnameVerifier).build();