一、背景
在使用第三方 SDK 实现 API 调用时,本地开发及测试环境正常。但在现场服务器无外网环境下,需通过内外网代理实现 API 调用时,遇到 SSL 证书校验失败的问题。由于 SDK 内部封装了 OkHttp 对象,无法直接使用通用的方式跳过 SSL 校验,因此需要通过配置证书来解决。
二、问题分析
现场使用 Nginx 进行代理转发,未配置有效证书的情况下后台报错:
{"statusCode":-1,"message":"SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target","code":"network error","isJson":false}
该错误表明 Java 客户端无法找到有效的证书路径。排查 Nginx 日志为空,确认报错由 Java 内部拦截。在不走代理的情况下可以直接访问 API,说明问题在于 Java 请求 Nginx 获取证书时,Nginx 返回的是自签证书或证书不匹配,导致验证失败。

三、解决方案
Nginx 自签发的证书不被第三方 API 认可,需要获取第三方 API 请求地址对应的证书文件。单个域名可直接使用 OpenSSL 导出证书。
# 根据域名导出 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
若需处理多个请求地址,可参考相关文档生成组合域名的证书文件。
获取证书后,需将其添加到 Java 信任库,确保请求地址证书、Java 信任库证书、Nginx 证书三者一致。
# 证书添加到 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



