起因,在认证SSO过程中需要调用https时报错:
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
原因就是SSL证书过期或者失效了
我们以百度为例,先打开百度网站
依次点击,图标可能会有所不同,
然后默认导出即可,文件名自定义
接下来就是导入操作了
打开JDK的目录,%JAVA_HOME%/jre/lib/security,在此目录打开控制台,输入命令,这里我分别演示两种情况,我用同样的命令在linux上执行是成功的没报错,但是证书并未生效,第二种方式是翻阅资料找到的,说是要加引号,但我加上还是未生效,如果遇到这种情况,可以试试这两种方式试试看
keytool -import -alias pro1 -keystore C:\mine\jdk7\jre\lib\security\cacerts -file C:\Downloads\pro1.cer
keytool -import -alias pro1 -keystore /usr/jdk7/jre/lib/security/cacerts -file /tmp/pro1.cer
接下来会让你安装证书,按要求输入即可,密码默认是“changeit”
如果遇到keytool不可用这种情况,大概率就是没有设置JAVA_HOME,java -version看下,或者把keytool换成%JAVA_HOME%/bin/keytool,直接使用绝对路径
最后重启服务即可,以上我测试下来Windows环境是OK的,Linux并未生效
最后为了解决这个困扰我两天的问题妥协了,使用绕过SSL认证,这个也是百度了各种方式,因为使用的jdk7,有各种版本限制,最终找到解决方案:
public static CloseableHttpClient getScontractHttpClient() {
SSLContext sslContext = null;
try {
sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
return true;
}
}).build();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
}
//创建httpClient
return HttpClients.custom().setSSLContext(sslContext).
setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
}
使用的时候调用这个方法获取HttpClient即可,接下来操作就无异了