unable to find valid certification path to requested target的异常解决办法
一.异常现象
我在利用cas-overlay-template搭建单点登录服务器的时候,服务器正常启动起来,然后我又搭建了一个cas客户端,也配置好了与服务器的连接,结果我在浏览器访问客户端的api时,浏览器提示出现500异常。然后控制台提示信息如下:
java.lang.RuntimeException: .ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat org.jasig.cas.monUtils.getResponseFromServer(CommonUtils.java:458) ~[cas-client-core-3.5.0.jar:3.5.0]at ......Caused by: .ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[na:1.8.0_192]at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946) ~[na:1.8.0_192]at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316) ~[na:1.8.0_192]at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:310) ~[na:1.8.0_192]at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1639) ~[na:1.8.0_192]....Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397) ~[na:1.8.0_192]at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302) ~[na:1.8.0_192]at sun.security.validator.Validator.validate(Validator.java:262) ~[na:1.8.0_192]......Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) ~[na:1.8.0_192]at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) ~[na:1.8.0_192]at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) ~[na:1.8.0_192]at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:392) ~[na:1.8.0_192]... 81 common frames omitted
导致异常的直接原因是:
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target。
但是根本的异常是.ssl.SSLHandshakeException,这个异常其实是因为cas客户端与cas服务器在进行通信时,https协议需要导入SSL认证证书,我们本地开发时,用的是自制的认证证书,这个自制的认证证书会影响我们开发测试。
二.解决办法
解决该问题,总体上来说有2种方式:
①.创建认证证书并导入证书到本地cacerts库中;
②.取消证书认证,信任所有请求链接。
解决方式一:导入证书到本地cacerts库中
1.创建密钥库
利用jdk自带的keytool工具,就可以制作本地密钥库,命令如下:
keytool -genkey -alias casserver -keyalg RSA -keystore F:\cas.keystore
通过以上命令,我们就创建了一个别名为 casserver 的密钥库,并把该密钥库存储到了F盘下,密钥库文件名称为cas.keystore。
2.导出生成认证证书
keytool -export -trustcacerts -alias casserver -file F:\cas.cer -keystore F:\cas.keystore
通过以上命令,我们把本地密钥库导出了一个名为cas.cer的认证证书。
3.导入认证证书到cacerts本地库中
keytool -import -trustcacerts -alias casserver -file F:\cas.cer -keystore "C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\security\cacerts"
这样我们就把别名叫做 “casserver” 的cas.cer认证证书,导入到了"C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\security\cacerts"的本地证书库中。注意密钥库cacerts的默认口令是changeit。
然后再重新访问客户端,就可以实现与cas服务端的认证通信了。
当我们在浏览器中访问cas客户端中的api,比如http://cas.:8080/user时,会重定向到如下cas服务端认证界面:
当认证通过后,才会进入到cas客户端界面中,如下图所示:
解决方式二:取消证书认证,信任所有请求链接
我们可以为maven添加如下属性:
maven.wagon.http.ssl.insecure=true
在mvn命令后面加上-Dmaven.wagon.http.ssl.insecure=true,此属性是让maven忽略安全性,不再校验服务器的证书(此时服务器的证书可能是被替换的),完整配置如下:
mvn -Dmaven.wagon.http.ssl.insecure=true package
但是在我的环境中,经过测试,发现本方式并不好使。