异常:
项目中需要用RestTemplate调三方接口,url是https开头加密的。postman可以调通,代码提示没有证书,具体如下:
[ERROR][2023-06-25 10:41:16,574][com.peraglobal.restInterface.controller.PLMController]I/O error on POST request for "...":sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException : PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certificat ion path to requested target
PKIX路径构建失败,无法找到到请求目标的有效证书路径
解决办法:
将访问网址域名的有效证书添加到jdk的信任证书中。
一、获取证书:
- 可以在浏览器中输入目标网址域名,点击左侧 证书(正常清空证书应该是有效的,我的客户服务器没有联网所以提示无效证书)
正常是这样的
右键证书,找到详细信息,点击复制到文件
证书导出向导下一步:
选择 Base64编码
输入文件名并选择文件的生成路径
- 如果跟我一样无效的证书,可以找接口的提供方要一个有效的证书
二、将证书添加到jdk里
管理员权限打开cmd,输入命令:
keytool -importcert -file "C:\Users\sdmadmin\Desktop\UAT.crt" -storepass changeit -keystore "%JAVA_HOME%/jre/lib/security/cacerts"
UAT.crt是刚刚保存的证书路径,-keystore后面是jdk里下的路径
如果没配置javahome变量可以写cacerts的绝对路径。
在提示是否信任时输入 是
如果提示 keytool 错误: java.io.FileNotFoundException: cacerts (拒绝访问。)那么用管理员打开cmd执行一次
三、 重启项目
证书添加完后 重启tomcat,再次调用接口就成功了
关于keytool的命令:
命令 | 说明 |
---|---|
-certreq | 生成证书请求 |
-changealias | 更改条目的别名 |
-delete | 删除条目 |
-exportcert | 导出证书 |
-genkeypair | 生成密钥对 |
-genseckey | 生成密钥 |
-gencert | 根据证书请求生成证书 |
-importcert | 导入证书或证书链 |
-importpass | 导入口令 |
-importkeystore | 从其他密钥库导入一个或所有条目 |
-keypasswd | 更改条目的密钥口令 |
-list | 列出密钥库中的条目 |
-printcert | 打印证书内容 |
-printcertreq | 打印证书请求的内容 |
-printcrl | 打印 CRL 文件的内容 |
-storepasswd | 更改密钥库的存储口令 |
-help | 查看全部命令 |
关于导入证书 keytool -importcert [OPTION]...
中的OPTION选项值:
命令 | 说明 |
---|---|
-noprompt | 不提示 |
-trustcacerts | 信任来自 cacerts 的证书 |
-protected | 通过受保护的机制的口令 |
-alias | 要处理的条目的别名 |
-file | 输入文件名 |
-keypass | 密钥口令 |
-keystore | 密钥库名称 |
-storepass | 密钥库口令 |
-storetype | 密钥库类型 |
-providername | 提供方名称 |
-providerclass | 提供方类名 |
-providerarg | 提供方参数 |
-providerpath | 提供方类路径 |
-v | 详细输出 |
示例
keytool -important -file "C:\Program Files\example.cer" 导入example文件作为证书