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.pswp.cn/web/94888.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94888.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94888.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C語言入門級教學】sizeof和strlen的對?

1.sizeof和strlen的對? 1.1 sizeof sizeof 計算變量所占內存空間??的,單位是字節,如果操作數是類型的話,計算的是使?類型創建的變量所占內存空間的??。 sizeof 只關注占?內存空間的??,不在乎內存中存放什么數據。 ?如&a…

線程安全及死鎖問題

系列文章目錄 初步了解多線程-CSDN博客 目錄 系列文章目錄 前言 一、線程安全 1. 線程安全問題 2. 問題原因分析 3. 問題解決辦法 4. synchronized 的優勢 1. 自動解鎖 2. 是可重入鎖 二、死鎖 1. 一個線程一把鎖 2. 兩個線程兩把鎖 3. N 個線程 M 把鎖 4. 死鎖…

2025年8月無人駕駛技術現有技術報告

第1章 引言 無人駕駛技術作為21世紀交通運輸領域最具革命性的技術創新之一,正在深刻地改變著人類的出行方式和生活模式。進入2025年,隨著人工智能、5G通信、高精度傳感器等關鍵技術的快速發展與成熟,無人駕駛技術已從實驗室的概念驗證階段逐…

CETOL 6σ 助力康美醫療(CONMED Corporation)顯著提升一次性穿刺器產品合格率

概述 康美醫療 (CONMED Corporation)將 Sigmetrix 的 CETOL 6σ 公差分析軟件應用于一次性穿刺器的結構優化。該裝置是微創外科技術的一次早期突破。在設計階段,團隊發現“測量臨界間隙”存在尺寸偏差、超出預期范圍,可能在手術中造成患者皮膚損傷&…

LaunchScreen是啥?AppDelegate是啥?SceneDelegate是啥?ContentView又是啥?Main.storyboard是啥?

雖然我很想挑戰一下swiftui,但是精力真的是有限,把精力分散開不是一個很好的選擇,so swiftui淺嘗則止了,目前的精力在html上面。 AppDelegate todo SceneDelegate todo ContentView 最明顯的就是這個,當編輯的時候,頁面…

垃圾回收機制(GC)

目錄 垃圾回收機制 引用計數法 可達性分析算法 垃圾回收算法 標記清除算法 復制算法 標記壓縮算法 JVM中一次完整的GC(分代收集算法) 在新生代中 在老年代中 空間分配擔保原則 對象從新生代進入老年代的幾種情況? Young GC 和 Full GC 垃…

DNS域名系統

DNS域名系統一、什么是DNS?二、DNS的域名層級1. 根域2. 頂級域3. 二級域4. 三級域(子域)5. 主機名三、DNS服務器的分類四、DNS的解析過程五、DNS的記錄類型六、FQDN(完全限定域名)一、什么是DNS? DNS(Domain Name S…

虛擬內存和虛擬頁面

虛擬內存虛擬內存是現代操作系統提供的一種內存管理機制,它允許程序訪問比實際物理內存更大的地址空間。虛擬內存通過將程序的地址空間劃分為多個固定大小的塊(稱為頁面),并將這些頁面映射到物理內存或磁盤上的頁面文件中&#xf…

【2025年電賽E題】基于k230的矩形框識別鎖定1

文章目錄 概要 整體架構流程 技術名詞解釋 技術細節 1. 多閾值適配與目標識別邏輯 2. 動態ROI與狀態管理機制 3. 數據平滑與偏差計算 4. 硬件適配與UART通信 小結 靜態矩形框識別 動態矩形框追蹤 概要 本文分析的代碼是基于立創廬山派K230CanMV開發板的目標追蹤系統實現,主要…

c語言中的數組可以用int a[3]來創建。寫一次int就可以了,而java中要聲明兩次int類型像這樣:int[] arr = new int[3];

C 語言數組只需寫一次int,而 Java 需兩次int相關聲明,核心原因是兩種語言的數組本質定義、類型系統設計和內存管理邏輯完全不同,具體可拆解為兩點核心差異:一、C 語言:數組是 “內存塊的類型綁定”,一次聲明…

深度學習——詳細教學:神經元、神經網絡、感知機、激活函數、損失函數、優化算法(梯度下降)

神經網絡實戰: 深度學習——神經網絡簡單實踐(在乳腺癌數據集上的小型二分類示例)-CSDN博客https://blog.csdn.net/2302_78022640/article/details/150779819?spm1001.2014.3001.5502 深度學習——神經網絡(PyTorch 實現 MNIST…

Ubuntu 軟件安裝的五種方法

1、App Store 安裝 Ubuntu 里面有 一個App叫 “Ubuntu軟件” 2、Sudo apt-get install 安裝法 注意 使用apt工具安裝軟件,需要sudo,也就是root權限 例子 apt -get install git 會提示查看是否以root用戶運行,install-安裝sudo a…

Day15 (前端:JavaScript基礎階段)

接續上文:Day14——JavaScript 核心知識全解析:變量、類型與操作符深度探秘-CSDN博客 點關注不迷路喲。你的點贊、收藏,一鍵三連,是我持續更新的動力喲!!! 主頁:一位搞嵌入式的 genius-CSDN博…

在線旅游及旅行管理系統項目SQL注入

1.前言 之前在網上隨便逛逛的時候,發現一個有各種各樣的PHP項目的管理系統,隨便點進一個查看,發現還把mysql版本都寫出來了,而且還是PHP語言。 https://itsourcecode.com/free-projects/php-project/online-tours-and-travels-m…

Java網絡編程(UDP, TCP, HTTP)

1. OSI 七層網絡模型層級名稱核心功能協議示例數據單元7應用層提供用戶接口和網絡服務HTTP, FTP, SMTP, DNS報文6表示層數據格式轉換、加密/解密、壓縮/解壓SSL, JPEG, MPEG數據流5會話層建立、管理和終止會話連接NetBIOS, RPC會話數據4傳輸層端到端可靠傳輸、流量控制、差錯校…

【P2P】P2P主要技術及RELAY服務1:python實現

P2P 技術 P2P(點對點)網絡的核心是去中心化的網絡拓撲和通信協議。DP的應用相對較少,但可能出現在: 路由優化:在一些復雜的P2P網絡中,一個節點需要向另一個節點發送消息。為了找到一條延遲最低或跳數最少的路徑,可能會用到類似最短路徑的算法,而這類算法(如Bellman-F…

docker 安裝 redis 并設置 volumes 并修改 修改密碼(一)

在 Docker 中安裝 Redis 并設置volumes持久化數據,同時修改 Redis 密碼的完整步驟如下: 安裝 Docker 如果還沒有安裝 Docker,可以參考以下步驟安裝: 在 Alibaba Cloud Linux 上安裝 Docker # 更新系統 sudo yum update -y# 安裝 Docker 依賴 sudo yum install -y yum-util…

如何找出所有連接到本機指定端口的客戶端 IP

在日常運維或排查網絡問題時,我們常常需要知道:有哪些客戶端正在連接我的服務?連接數是否異常?是否存在惡意掃描或 DDoS 行為?本文將教你使用一條簡潔高效的 Linux 命令組合,統計連接到本機某個端口&#x…

java IDE安裝idea社區版步驟

IntelliJ IDEA 社區版(Community Edition)是一款功能強大且完全免費的集成開發環境,非常適合 Java 和 Kotlin 初學者或進行基礎開發2。我會為你提供詳細的安裝步驟。 🛠 IntelliJ IDEA 社區版安裝指南 📋 系統要求與…

Agent智能體

什么是 Agent? Agent 是一個智能體,可以接收用戶請求,利用大模型(LLM)的推理能力,自動決定: 自己回答還是調用外部工具(數據庫、API、腳本等) 最終把結果返回給用戶。 能…