项目场景
给云服务器上用Docker部署的Minio添加域名(HTTPS)访问后,本地之前配置的项目报错
问题描述
后端服务启动失败,报错信息如下:
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:388) ~[na:na]
at java.base/sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:271) ~[na:na]
at java.base/sun.security.validator.Validator.validate(Validator.java:256) ~[na:na]
at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:230) ~[na:na]
at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:132) ~[na:na]
at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(CertificateMessage.java:1302) ~[na:na]
... 31 common frames omitted
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at java.base/sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:148) ~[na:na]
at java.base/sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:129) ~[na:na]
at java.base/java.security.cert.CertPathBuilder.build(CertPathBuilder.java:297) ~[na:na]
at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:383) ~[na:na]
... 36 common frames omitted
原因分析
1.产生错误的原因:
unable to find valid certification path to requested target
->无法找到指向请求目标的有效认证路径
2.错误解释
这个错误表示客户端(如浏览器或应用程序)在建立安全连接时,无法验证服务器证书的有效性。具体来说:
- 客户端会检查证书链(从服务器证书到根证书),确保所有环节都受信任
- 如果任何一环证书缺失、无效或不受信任,就会触发此错误
- 根本原因是信任链断裂,导致无法确认目标服务器的身份,常见于开发、测试或部署环境
3.常见原因
以下原因都可能导致证书路径无效:
问题类型 | 描述 |
---|---|
自签名证书 | 服务器使用自签名证书,而非来自公共CA(证书颁发机构),JVM或系统默认信任库中不包含它 |
证书链不完整 | 服务器证书缺少中间CA证书,导致链式验证失败(例如,只提供了终端证书,但未包括中间证书) |
证书过期或无效 | 服务器证书已过期、吊销或签名错误,无法通过有效期检查 |
根证书不受信任 | 根CA证书不在客户端的信任库中(如Java的cacerts文件),尤其在自定义或私有CA场景 |
主机名不匹配 | 证书中的域名(CN或SAN)与请求的URL不匹配,例如访问https://example.com但证书是为test.example.com签发 |
环境配置问题 | 开发工具(如IDE)或网络代理干扰了证书验证,或信任库未正确更新 |
解决方案
经分析,可能是自签名证书,因为没有配置根证书,所以可能是因为Java的JDK的信任库中不包含对当前配置访问的网站的CA证书
1.下载网站对应的证书文件
- 打开浏览器访问目标网站,在地址栏点击锁形图标(Chrome/Edge/Firefox浏览器均支持)
- 选择“证书”或“查看证书”选项,进入证书详细信息页面
- 切换到“详细信息”选项卡,点击“复制到文件”或“导出”按钮,选择导出格式为Base64编码的X.509证书(.CER或.PEM格式)
- 指定保存路径并完成导出,确保文件可被后续步骤调用
下面是导出的示例(Edge)
PS: 如果其他的浏览器或者发现下载过程不一致可自行查询下载方式
2.将证书导入Java信任库
使用keytool
工具(位于JDK
的bin
目录下)执行以下命令导入证书:
Windowns
keytool -import -alias your_alias_name -keystore $JAVA_HOME/lib/security/cacerts -file /path/to/exported_certificate.crt
Linux
keytool -import \
-alias your_alias_name \
-keystore $JAVA_HOME/lib/security/cacerts \
-file /path/to/exported_certificate.crt
默认信任库密码为changeit
,按提示输入密码并确认信任此证书
PS:
$JAVA_HOME
是配置的JDK环境变量,执行命令的时候也可以直接到$JAVA_HOME/lib/security/
这个目录下面使用cmd,然后后面写命令的时候就可以不用写一长串,直接用./cacerts
(注意一定到写到这个位置哈,否则会在其他地方重新创建一个cacerts 文件)
示例如下:
3.验证导入是否成功
Windows
keytool -list -keystore $JAVA_HOME/lib/security/cacerts -alias your_alias_name
Linux
keytool -list \
-keystore $JAVA_HOME/lib/security/cacerts \
-alias your_alias_name
示例如下:
然后重新运行程序,报错消失,问题成功解决!