背景
在集成第三方 SDK 进行 API 调用时,本地开发环境通常网络通畅,但现场服务器若处于内网环境,需通过代理访问外部接口。常规做法是直接忽略 SSL 校验,但在 SDK 内部封装了 OkHttp 等组件时,无法通过全局配置绕过,必须正确处理证书信任链。
问题定位
现场使用 Nginx 进行代理转发,未配置有效证书的情况下,后台直接报错:
SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
该错误表明 Java 客户端无法验证目标服务器的证书链。排查 Nginx 日志为空,确认是 Java 内部拦截并提示的。在不走代理的情况下可以直接访问 API,说明问题出在 Java 与 Nginx 之间的证书交互上。Nginx 返回的自签名证书未被 Java 信任库认可,导致握手失败。

解决方案
Nginx 自身签发的证书不被第三方 API 认可,需要获取目标域名对应的真实证书文件,并将其加入 Java 信任库。确保请求地址证书、Java 信任库证书、Nginx 证书三者一致。
1. 导出目标域名证书
单个域名可直接使用 OpenSSL 导出证书。以阿里云 DashScope 为例:
# 根据域名导出 crt 证书
D:\OpenSSL-Win64\bin\openssl.exe s_client -connect dashscope.aliyuncs.com:443 -servername dashscope.aliyuncs.com <NUL 2>NUL | D:\OpenSSL-Win64\bin\openssl.exe x509 -outform PEM -out F:/dashscope.crt
如果有多个请求地址需要生成组合域名的证书文件,建议分别导出后合并,或参考相关文档配置多域名 HTTPS。
2. 导入证书到 Java 信任库
拿到证书文件后,必须将其交给 Java 信任库(cacerts),否则程序依然不认可该证书。
# 证书添加到 java 信任库,默认密码通常为 changeit
keytool -import -alias amapaliyun-www -keystore "D:\JDK1.8\jre\lib\security\cacerts" -file "D:\nginx-1.19.7_B\conf\cert\amapaliyun.crt" -storepass changeit -noprompt
执行后会提示是否信任,输入 yes 确认即可。
3. 验证与重启
查看信任库中的证书信息,确认导入成功:
# 查看信任库中的证书
keytool -list -keystore "D:\JDK1.8\jre\lib\security\cacerts" -alias amapaliyun-www -storepass changeit



