在开发和部署过程中,我们经常会遇到调用第三方 HTTPS 接口时抛出 javax.net.ssl.SSLHandshakeException
异常的问题。这种异常通常是由于 JDK 不信任目标接口的证书导致的。本文将详细分析问题的原因,并提供完整的解决方案,帮助您彻底解决此类问题。
1. 问题背景
在部署在 Linux 系统的项目中,调用第三方 WebService 的 HTTPS 接口时,可能会抛出以下异常:
plaintext
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException
原因分析:
- 目标接口的证书未被 JDK 信任。
- JDK 默认只信任其内置的根证书颁发机构(CA)签发的证书。
- 如果目标接口使用的是自签名证书或非主流 CA 签发的证书,JDK 会拒绝建立安全连接,从而抛出异常。
2. 解决方案
要解决此问题,需要将目标接口的证书导入到 JDK 的信任库中。以下是具体步骤:
2.1 下载目标接口的证书
- 在浏览器中打开目标接口的 URL:
- 例如,访问
https://api.example.com
。
- 例如,访问
- 查看证书信息:
- 在浏览器的地址栏中,点击锁图标,选择“证书信息”或“查看证书”。
- 导出证书:
- 选择“导出”或“保存”,将证书保存为
.cer
或.crt
格式的文件,例如api.example.com.cer
。
- 选择“导出”或“保存”,将证书保存为
2.2 将证书复制到 JDK 目录
- 找到 JDK 安装路径:
- 例如,JDK 安装路径为
/usr/lib/jvm/java-11-openjdk-amd64
。
- 例如,JDK 安装路径为
- 将证书复制到 JDK 的
jre/lib/security
目录:- 例如,将