一、异常现象
利用java代码向某个https地址发送请求的时候,出现如下异常:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed Error
二、问题定位
根据异常信息初步判断为https证书缺失,为了验证判断的正确性,可以进入%JAVA_HOME%/bin目录,打开windows命令行窗口,执行如下命令:
keytool -list -keystore "../jre/lib/security/cacerts"
点击Enter键跳过密码,查看已经存在的证书列表。结果显示,我们请求https地址的证书的确不在列表中
三、解决方案
第一步,我们需要下载该证书。可以通过谷歌浏览器访问我们想要的https地址,然后点击地址栏前面的红色警告,查看站点信息,点击证书,选择详细,点击拷贝证书到文件,下一步
选择Base-64 encoded X.509格式,下一步,点击浏览按钮,任意选择一个目录,我们这里为了方便,指定到%JAVA_HOME%/bin目录,输入证书名称xxx.cer
第二步,运行下面的命令行,将证书添加到证书列表中
keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>
说明:
<AliasName>: 我们的证书名称为xxx.cer, 这里可以使用xxx作为别名
<certificate>:可以使用证书的绝对路径也可以使用相对路径,比如我们这里为./xxx.cer
<KeystoreFile>:keystore文件,我们这里使用相对路径,../jre/lib/security/cacerts
<Password>:java默认changeit
第三步,我们可以再运行 keytool -list -keystore "../jre/lib/security/cacerts" 命令检查我们的证书是否成功添加到了证书列表。