最近做ETC项目时候,在调用ETC接口出现了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
上面异常信息提示:请求目标没有发现有效的证书路径。访问ETC接口使用的是HTTPS安全的网络通信协议,导致该问题的原因是应用程序所在JVM环境没有找对对应的证书文件。
其实解决方法也挺简单,就是把接口地址的证书下载下来,然后安装到JVM所在环境中。具体步骤如下:
-
第一步: 在浏览器上输入应用程序需要调用的接口地址,然后按下F12,然后在security栏目中点击View certificate按钮;
记住证书的名字:
-
第二步:在“运行”中输入
certmgr.msc
,打开证书管理窗口后,找到我们需要下载的证书文件;
-
第三步:选中需要下载的证书文件,然后鼠标右键->所有任务->导出,把证书导出到本地磁盘上;
-
第四步:打开命令窗口,然后执行
keytool
命令,将证书安装到本地环境中;
参数说明:
-import 导入证书操作
-alias 秘钥对的别名
-keystore 秘钥对的路径及名称
-file 证书文件的路径
-trustcacerts 告诉keytool您要将其导入作为受信任的证书
例如:
keytool -import -alias cacerts -keystore cacerts -file D:\JavaEE\JDK\jdk1.8.2\jre\lib\security\zsetc.crt -trustcacerts
输入秘钥库的口令回车即可。
如果要查看已安装的证书,可以执行以下命令:
keytool -list -v -alias cacerts -keystore cacerts -storepass 秘钥库的口令
删除证书:
keytool -delete -alias cacerts -keystore cacerts -storepass 秘钥库的口令
除了上面方法以外,在JDK 8u101版本添加了三个新的根证书(https://bugs.openjdk.java.net/browse/JDK-8154757)。
因此,也可以通过升级JDK的方式解决上面的问题。