解决:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExcep—SSL证书导入Java信任库
本文记录了在内网服务器通过Nginx代理调用第三方API时遇到的SSL证书校验问题及解决方案。由于内网环境无法直接访问外网API,而Nginx代理使用了自签证书导致Java报错"unable to find valid certification path"。解决方法是通过OpenSSL导出API请求地址对应的合法证书,并将其导入Java信任库,确保请求地址证书、Java信任库
一、前言背景
笔者使用第三方SDK实现API调用,本地开发及测试均OK。但是现场服务器没有外网,需要使用内外网代理实现API的调用。
常规情况为了省事我们都会使用一行代码来跳过SSL校验:SslUtil.ignoreSsl();
可这次用的是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}
大体意思就是找不到对应SSL证书,排查Nginx日志为空,可以确认该报错是Java自己内部拦截并提示的。按照不走代理的情况下是可以直接访问API,所以这种情况一定是Java去找Nginx要证书,结果Nginx没给,或者给了个驴头不对马嘴的自签证书。

Java:用户要访问阿里云API,给我一下 aliyuncs.com的证书
Nginx:给——https.crt
Java:不是哥们,你这证书保真吗?看着像是个自签证书啊
Nginx:你是找事儿啊还是验证书啊,我一个代理网络的能给你假证书吗?
Java:行行,那你给我包起来返回吧
Nginx:(骂骂咧咧嘟囔着返回了证书信息)
Java:unable to find valid certification path,用户请求了但是没找到证书,去和我的 rm刀解释吧!
三、解决方案
Nginx的证书不仅被Java “ 砍 ” 了,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
如果有多个请求地址需要生成组合域名的证书文件:
参考地址:Nginx多域名HTTPS配置全攻略:从证书生成到客户端安装
好了,这下我们拿到的证书文件,接下来就要把它交给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

--查看信任库中的证书
keytool -list -keystore "D:\JDK1.8\jre\lib\security\cacerts" -alias amapaliyun-www -storepass changeit

至此,我们就把证书全部配置完成,然后重新启动服务,重新启动Nginx进行测试验证即可。
四、总结回顾
写这篇笔记总共花了二十分钟,其中五分钟还是在找华强砍瓜的图片,但实际排查问题解决问题足足花了三个多小时。这里总结回顾主要是想记录一下,遇到问题后一定要先定位问题点而不是乱猜乱试。比如本文的问题,只有定位到那个报错是Java返回的就已经解决了一大半,剩下的只要正向推理尝试便不会再耽误时间。而笔者却在生成的证书上花了很长时间确认它是否有问题,其实只需要查看Nginx日志便可以划分出来,记录,共勉。
更多推荐


所有评论(0)