SpringBoot运行报错sun.security.provider.certpath.SunCertPathBuilderException

项目场景

给云服务器上用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工具(位于JDKbin目录下)执行以下命令导入证书:

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

示例如下:

在这里插入图片描述

然后重新运行程序,报错消失,问题成功解决!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值