背景

目前在做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

https://blog.51cto.com/u_16213393/13782064

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐