Java有关SSL证书报错PKIX path building failed的一种解决办法
目前在做CAS的部署测试,服务端和客户端的配置都由一开始的IP地址改为了HTTPS的域名地址,结果登录之后回调客户端时,客户端出现了有关SSL证书的错误。经过测试,只使用CAS登录服务端是正常的,只有在客户端callback的时候出现这个报错。只是改了这么一点点东西,就出现一些全新的问题,每前进一步都是这么的艰难、枯燥。
背景
目前在做CAS的部署测试,服务端和客户端的配置都由一开始的IP地址改为了HTTPS的域名地址,结果登录之后回调客户端时,客户端出现了有关SSL证书的错误。经过测试,只使用CAS登录服务端是正常的,只有在客户端callback的时候出现这个报错。
只是改了这么一点点东西,就出现一些全新的问题,每前进一步都是这么的艰难、枯燥。
报错的主要内容为:SSL error getting response from host、PKIX path building failed、PKIX path building failed。大意是从主机(服务端)请求响应的时候,由于SSL错误PKIX构建失败。
报错详情如下:
18:57:32.445 [http-nio-9000-exec-3] ERROR o.j.c.c.u.CommonUtils - [getResponseFromServer,457] - SSL error getting response from host: xx.wuyitian.cn : Error Message: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
关于PKIX是什么,我查阅到的信息是这样的。
Java使用PKIX(Public Key Infrastructure X.509)验证证书链的完整性,但当链中的证书不在信任库中时,就会导致这个问题的发生。
所以问题就在对于Java程序来说,这个SSL证书不受信任就拒绝解析,那么就是解决受信问题就可以了。
一些弯路
在了解一点知识后,我尝试按照自己的判断去解决问题,然后就走弯路了。分享出来只是希望告诉后面的小伙伴,我尝试过这个方向了,没有成功,如果大家有新的思路,可以一起尝试解决。
客观上,我所用的SSL证书是能在公网正常解析的,理论上来说,不像其他文章所描述的使用自签名证书存在https的受信问题,我们直接访问https://wuyitian.cn,由于SSL证书有效,对于浏览器来说已经是安全受信的,所以访问这个域名应该也是安全的才对。
于是我想是不是因为本地部署的是http,SSL在nginx上,才出现这样的问题,于是我把服务端和客户端都使用了SSL访问,而且使用了正式的SSL证书,再一番测试,还是不行。
最后失望的我,只好用了其他文档说到的方案。
解决方案-给Java添加受信证书
我的服务端和客户端分别是OpenJDK的Java21和Java8的环境,在实际使用时,发现它们的位置是有点不一样的。
Java21的证书路径
Java21的路径在 lib\security
D:\Software\Java\jdk-21.0.2\lib\security

特殊的Java8证书路径
通常情况下Java8的证书路径和上面一样的,不过我的电脑不知道为何是在 jre\lib\security,这里也记录一下。
D:\Software\Java\jdk1.8.0_361\jre\lib\security

转换der证书
Java这里只能使用der证书,而我们一般颁发的证书是crt、pem等格式,所以这里需要转换一下,以pem证书的转换为例,请注意,wuyitian.cn 是自己使用的域名,大家自行替换。
使用终端命令进入到上述的Java证书路径,将原本的pem证书复制到该目录下,然后使用命令进行转换:
openssl x509 -outform der -in wuyitian.cn.pem -out wuyitian.cn.der
转换完毕后,可以看到底下多出来一个der格式的证书。

添加证书到cacerts
接下来,我们使用命令将der证书导入,并在最后设置域名信息
keytool -import -keystore cacerts -file wuyitian.cn.der -alias wuyitian.cn
执行命令后,会提示需要输入密钥库口令

如果你不知道,可以尝试使用默认的密码(通常是 changeit 或者在创建 keystore 时设置的密码)。
changeit
最后会有一个提示,是否信任这个证书,我们需要输入:yes


重新启动Java程序
证书添加之后,Java程序需要重新启动,然后这个问题就解决了,可以去踩下一个坑了,哈哈哈哈。
参考链接:
https://blog.csdn.net/jiang877864109/article/details/113416923
https://apereo.github.io/cas/7.3.x/installation/Troubleshooting-Guide.html#ssl--certificates
更多推荐

所有评论(0)