当前位置: 首页 > news >正文

Spring Boot 使用 RestTemplate 调用 HTTPS 接口时报错:PKIX path building failed 解决方案

在使用 Spring Boot + RestTemplate 调用 HTTPS 接口时,很多同学会遇到类似下面的报错:

javax.net.ssl.SSLHandshakeException: 
PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

这类错误通常意味着:JVM 无法信任目标服务返回的证书

一、为什么会出现 PKIX path building failed?

PKIX path building failed 的意思是 证书链校验失败,JVM 在校验证书时没有找到可信的路径。常见原因有以下几种:

1. JDK 版本过旧

  • 较早的 JDK(如 JDK8u101 之前)默认内置的 CA 根证书库较老。

  • 如果目标网站使用了新 CA(例如 Let's Encrypt 2021 年更新过根证书),老 JDK 可能无法识别。

2. 服务器证书链不完整

  • 有些服务器只配置了 站点证书,但忘记安装 中间证书

  • 浏览器会自动帮你补全中间证书,所以能正常访问;

  • 但 JVM 不会自动补全,导致校验失败。

3. 证书域名不匹配

  • 如果访问 https://example.com,但证书只签发给了 api.example.com,也会校验失败。

4. 使用了自签名证书

  • 内网测试时常见,需要手动导入证书到 JDK 信任库。

二、如何排查?

  1. 检查证书链是否完整

    openssl s_client -connect yourdomain.com:443 -showcerts
    

    如果只输出一段证书而没有中间 CA,说明配置不完整。

  2. 检查域名是否匹配

    openssl s_client -connect yourdomain.com:443 | openssl x509 -noout -text | grep DNS:
    

    看 SAN 字段里是否包含你访问的域名。

  3. 检查 JDK 版本

    java -version
    

    建议 JDK8 至少升级到 8u202+ 或者直接使用 JDK11/17。

三、解决方案

方案一:升级 JDK(推荐)

如果你使用的是公有 CA 签发的证书(DigiCert、GlobalSign、Let's Encrypt 等),一般不需要手动导入证书
只要 JDK 足够新,并且目标服务器配置了完整证书链,就可以正常使用。


方案二:修复服务器证书链

如果你是目标服务的维护方,确保服务器正确安装了 完整证书链

  • 站点证书

  • 中间证书

  • 根证书(通常不需要手动安装)

Nginx 示例配置:

ssl_certificate     fullchain.pem;   # 包含站点证书 + 中间证书
ssl_certificate_key privkey.pem;

方案三:导入证书到 JDK 信任库(自签名或内部 CA)

如果必须调用自签名 HTTPS 服务,可以手动导入证书:

keytool -import -alias myserver \-keystore $JAVA_HOME/jre/lib/security/cacerts \-file server.crt

默认密码:changeit


方案四:跳过 SSL 验证(仅限开发测试)

在测试环境,可以让 RestTemplate 忽略证书校验:

public static RestTemplate insecureRestTemplate() throws Exception {TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {public void checkClientTrusted(X509Certificate[] chain, String authType) {}public void checkServerTrusted(X509Certificate[] chain, String authType) {}public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }}};SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(null, trustAllCerts, new java.security.SecureRandom());HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();factory.setHttpClient(HttpClients.custom().setSSLContext(sslContext).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).build());return new RestTemplate(factory);
}

四、总结

  • 如果是 公有 CA 签发的证书,通常不需要额外配置,只要:

    • JDK 版本足够新

    • 目标服务器安装了完整证书链
      就能解决。

  • 如果是 内部/自签名证书,需要手动导入到 JDK 信任库。

  • 开发环境临时调试,可以使用 跳过 SSL 验证的 RestTemplate,但千万不要在生产使用

http://www.xdnf.cn/news/1393633.html

相关文章:

  • GY-BMP280压强传感器完整工程stm32控制
  • Woody:开源Java应用性能诊断分析工具
  • “游戏手柄”线性霍尔传感器IC替代方案:赛卓SC470X
  • 深度对比:BQ79758-Q1 vs BQ79718-Q1,哪款汽车级电池监测器更适合你的BMS设计?
  • LDA(隐狄利克雷分配):主题模型的经典之作
  • [机器学习]基于K-means聚类算法的鸢尾花数据及分类
  • 动态环境下的人员感知具身导航!HA-VLN:具备动态多人互动的视觉语言导航基准与排行榜
  • gpu与cpu各厂商的优劣
  • 吱吱企业通讯软件可私有化部署,构建安全可控的通讯办公平台
  • [TG开发]与Reids集成
  • 深度拆解 OpenHarmony 位置服务子系统:从 GNSS 到分布式协同定位的全链路实战
  • LeetCode - 1. 两数之和
  • 华硕主板 BIOS 提示——GPT header corruption has been detected
  • 【树论】树上启发式合并
  • RV1126的OSD模块讲解
  • 单节锂电池,升压至12V/2.5A的芯片选型指南(附FP5207X 与 FP7208参数表)
  • Zabbix-获取客户端的SNMP数据
  • CMake⼯程指南-2
  • Linux系统——EXT2 文件系统
  • 记录:HSD部署(未完成)
  • 基于 Vue + Interact.js 实现可拖拽缩放柜子设计器
  • CosyVoice win10启用记
  • 《Shell 大道:筑基篇(下)—— 流控筑根基,数据任驱驰》
  • 【K8s】整体认识K8s之与集群外部访问--service
  • 【Doris入门】Doris表模型完全指南:明细、聚合、主键模型的选择与优化技巧
  • layout版图设计学习笔记4_Virtuoso基础介绍
  • Altium Designer 22使用笔记(10)---PCB铺铜相关操作
  • 如何解决网关断网后时间不再统计的问题?无RTC子设备如何打通主网关的时间同步功能?
  • Unity EventTrigger 动态添加事件
  • 电商数据的获取方式:API、爬虫、第三方服务及更多