FeignClient發送https請求時的證書驗證原理分析

背景

微服務之間存在調用關系,且部署為 SSL 協議時,Feignt 請求報異常:

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

這個異常是怎么產生的,解決辦法是什么呢?利用 DeepSeek 回憶一下這個問題。輸入問題:

FeignClient發送 https 請求時的 SSL 驗證原理是什么呢

FeignClient在發送HTTPS請求時,其SSL驗證原理主要涉及SSL/TLS協議的握手過程、證書驗證機制以及如何處理自定義的SSL配置,以下是詳細的原理說明。

1. SSL/TLS握手過程

當FeignClient發起HTTPS請求時,首先會與目標服務器進行SSL/TLS握手。握手過程包括以下幾個步驟:

  • 客戶端發送支持的加密套件和壓縮方法:客戶端向服務器發送它支持的加密算法(如TLSv1.2)和壓縮方法。
  • 服務器響應并選擇加密套件:服務器選擇一個加密套件并發送自己的數字證書。
  • 證書驗證:客戶端驗證服務器的證書是否由受信任的證書頒發機構(CA)簽發。如果證書有效,則繼續握手。
  • 生成共享密鑰:客戶端生成一個隨機數(premaster secret),并使用服務器的公鑰加密后發送給服務器。
  • 服務器解密并生成會話密鑰:服務器使用自己的私鑰解密premaster secret,并生成會話密鑰,用于后續的加密通信。
  • 加密通信:客戶端和服務器使用會話密鑰對數據進行加密和解密,確保數據傳輸的安全性。

2. 證書驗證機制

在SSL/TLS握手過程中,證書驗證是確保通信雙方身份真實性的關鍵步驟。FeignClient在發送HTTPS請求時,會根據配置的SSL上下文(SSLContext)和信任管理器(X509TrustManager)來驗證服務器的證書。

  • 默認驗證:如果未配置自定義的SSL上下文,FeignClient會使用系統默認的SSL上下文,該上下文信任由Java自帶的CA簽發的證書。如果目標服務器的證書是自簽名的或由不受信任的CA簽發的,驗證會失敗,導致連接中斷。
  • 自定義驗證:通過配置自定義的SSL上下文和信任管理器,可以指定信任的證書或忽略證書驗證。例如,使用X509TrustManager信任所有證書,或者通過NoopHostnameVerifier忽略主機名驗證。

3. FeignClient的SSL配置

在Spring Cloud項目中,FeignClient的SSL配置通常通過以下方式實現:

  • 使用@FeignClient注解:在Feign客戶端接口中指定URL為HTTPS地址,例如:
  @FeignClient(name = "cloud-paltform", url = "https://xxx:9999")
  • 配置SSL上下文:通過自定義的Client配置類,設置SSL上下文和信任管理器。例如:
  @Configurationpublic class FeignHttpsConfig {@Beanpublic Client feignClient() {return new Client.Default(getSSLSocketFactory(), new NoopHostnameVerifier());}private SSLSocketFactory getSSLSocketFactory() throws Exception {SSLContext sslContext = SSLContext.getInstance("TLSv1.2");X509TrustManager tm = new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {// 忽略客戶端證書驗證}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {// 忽略服務器證書驗證}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}};sslContext.init(null, new TrustManager[]{tm}, new SecureRandom());return sslContext.getSocketFactory();}}

通過上述配置,FeignClient在發送HTTPS請求時會忽略SSL證書驗證,從而繞過證書信任問題。

  • Spring Boot配置:在application.ymlapplication.properties中配置SSL相關參數,例如:
  feign:httpclient:disable-ssl-validation: true

4. 繞過SSL驗證的注意事項

雖然繞過SSL驗證可以解決證書信任問題,但需要注意以下幾點:

  • 安全性風險:忽略SSL驗證會導致中間人攻擊(MITM)的風險,攻擊者可以攔截和修改通信內容,因此僅在測試環境中使用。
  • 證書管理:如果使用自簽名證書,需要將其添加到信任庫中,否則客戶端無法驗證證書的有效性。
  • 依賴管理:確保項目中引入了正確的依賴,例如feign-httpclient,以便使用HttpClient的SSL配置。

5. 總結

FeignClient在發送HTTPS請求時,通過SSL/TLS協議進行加密通信,并通過證書驗證確保服務器身份的真實性。

默認情況下,FeignClient會使用系統默認的SSL上下文,但可以通過自定義配置繞過SSL驗證。

在實際應用中,建議使用受信任的CA簽發的證書,并正確配置SSL上下文以確保通信的安全性。

解決辦法:

  1. 通過配置 feign.httpclient.disable-ssl-validation: true 禁用 SSL 校驗 。測試了,不生效。需要跟源碼看看具體生效配置是什么。
  2. 基于 spring-cloud-loadbalancer 的 Feign 客戶端配置禁用 SSL 校驗

結論:最好還是應該通過配置來控制,方法二需要添加一個條件。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907243.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907243.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907243.shtml

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

相關文章

性能優化關鍵:link、script和meta的正確打開方式

link 標簽的主要屬性及其作用 屬性是否必填作用描述示例值rel是定義當前文檔與鏈接資源的關系(必須屬性)。常見值:stylesheet, icon, preload, preconnect 等。rel"stylesheet" rel"icon"href是指定鏈接資源的URL。href…

Linux `less` 命令深度解析與高階應用指南

Linux `less` 命令深度解析與高階應用指南 一、核心功能解析1. 基本作用2. 與類似工具對比二、選項系統詳解1. 常用基礎選項2. 高階選項組合三、高階應用場景1. 日志分析系統2. 代碼審查系統3. 數據管道處理四、特殊文件處理1. 大文件優化查看2. 二進制文件分析五、交互式命令大…

影刀RPA-20-高級操作題2

一、題目 二、鏈接 方法一:影刀應用分享: 高級考試題2-第二次 方法二:影刀應用分享: 高級考試題2 三、代碼 方法一: import xbot from xbot import print, sleep from .import package from .package import variables as glv from xbot…

C# NX二次開發-獲取面法向和UV等數據

通過ufun函數UF_MODL_ask_face_props可以獲取到面的法向數據和UV和半徑等數據。 代碼如下: double[] uvs new double[4];double[] param new double[2];double[] point new double[3];double[] u1 new double[3];double[] v1 new double[3];double[] u2 new d…

SpringBoot整合Sa-Token:實現RBAC權限模型

Java系列文章 文章目錄 Java系列文章前言一、基礎概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 環境準備 二、表結構設計2.1 ER圖示例2.2 數據庫表設計2.2.1 用戶表2.2.2 角色表2.2.3 部門表2.2.4 權限表 三、SpringBoot整合Sa-Token3.1 sa-token基礎配置3.1.1 Maven配置3…

工商業儲能的“智慧大腦”:解密 Acrel-2000ES EMS 的核心功能與價值

安科瑞電氣顧強 市場背景:工商業儲能加速崛起 2022年中國已并網的儲能項目中,用戶側并網占比為8.36%,其中工商業儲能占據了用戶側高達98.6%的份額。驅動這一市場發展的關鍵因素日益顯著: 1.峰谷價差擴大: 全國各省市…

vue+threeJs 根據屏幕調整gltf模型的大小、重心、并更換騎車整體顏色

嗨,我是小路。今天主要和大家分享的主題是“vuethreeJs 根據屏幕調整gltf模型的大小、重心、并更換騎車整體顏色”。 項目案例示意圖 1.整體更換gltf模型的顏色 定義:整體代碼如下。顏色是事先設定的 const colorAry reactive(["rgb(21…

03 基于 java udp 做一個dns服務器 和 一個dns代理服務器

前言 這個也是 來自于一個朋友的需求 最終的目的是實現一個 dns 代理服務器, 當然 這本質也是一個 dns 服務器 并且 dns 代理服務器是依賴于 一個 dns 服務器的, 因此 順便給一個 dns 服務器的 demo 這里 主要是 基于 udp 的一個 dns 請求, 響應數據的交互 dns 服務器 …

【HITCSAPP 哈工大計算機系統期末大作業】 程序人生-Hello’s P2P

計算機系統 大作業 題 目 程序人生-Hello’s P2P 專 業 計算機與電子通信類 學   號 2023112915 班   級 23L0505 學 生 楊昕彥 指 導 教 師 劉宏偉 計算機科學…

第十周作業

一、CSRF 1、DVWA-High等級 2、使用Burp生成CSRF利用POC并實現攻擊 二、SSRF:file_get_content實驗,要求獲取ssrf.php的源碼 三、RCE 1、 ThinkPHP 2、 Weblogic 3、Shiro

PTA刷題筆記(難度預警!!!有詳解)

7-18 二分法求多項式單根 代碼如下&#xff1a; ? #include <stdio.h> #include <math.h>// 定義多項式函數 double polynomial(double x, double a3, double a2, double a1, double a0) {return a3 * x * x * x a2 * x * x a1 * x a0; }// 二分法求根函數 do…

打破傳統范式,線上 3D 畫展彰顯多元亮點

&#xff08;一&#xff09;沉浸式體驗&#xff0c;身臨其境賞畫? 線上 3D 畫展運用先進的 3D 建模和虛擬現實&#xff08;VR&#xff09;技術&#xff0c;高度還原了真實的展廳環境 。展廳內的布局、燈光&#xff0c;甚至墻壁的質感都被完美復刻&#xff0c;讓觀眾仿佛置身于…

Docker架構詳解

一,Docker的四大要素&#xff1a;Dockerfile、鏡像(image)、容器(container)、倉庫(repository) 1.dockerfile&#xff1a;在dockerfile文件中寫構建docker的命令,通過dockerbuild構建image 2.鏡像&#xff1a;就是一個只讀的模板&#xff0c;鏡像可以用來創建docker容器&…

【工具類】常用的工具類——CollectionUtil

目錄 cn.hutool.core.collection.CollectionUtil集合創建集合清空集合判空集合去重集合過濾集合轉換集合合并集合交集集合差集集合是否包含元素集合是否包含指定元素&#xff08;自定義條件&#xff09;集合分頁集合分組集合轉字符串元素添加元素刪除根據屬性轉Map獲取元素獲取…

從零起步搭建基于華為云構建碳排放設備管理系統的產品設計

目錄 &#x1f33f; 華為云 IoT&#xff1a;輕松上手碳排放設備管理系統搭建 &#x1f30d; 逐步搭建搭建規劃 &#x1f680; 一、系統藍圖&#xff1a;5大核心模塊&#xff0c;循序漸進 1?? 設備管理與數據采集層 2?? 數據傳輸與協議轉換層 3?? 數據處理與分析層…

華為OD機試真題—— 小明減肥(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 B卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

數據結構 -- 插入排序(直接插入排序和希爾排序)

插入排序 算法思想 每次將?個待排序的記錄按其關鍵字大小插入到前面已排好序的子序列中&#xff0c;直到全部記錄插入完成。 代碼實現 void InsertSort(int A[],int n){int i,j,temp;for(i 1;i<n;i){if(A[i]<A[i-1]){temp A[i]; //用temp暫存A[i]for(ji-1;j>…

word中表格拉不動以及插入圖片有間距

word中的表格寬度和高度怎么調整都改不了&#xff0c;可以將選中表格—右鍵—段落—取消勾選下圖中的兩項。 word中表格插入圖片始終有間隙&#xff0c;怎么也消除不了間隙&#xff0c;可以在表布局—單元格邊距—修改上下左右邊距為0即可

網絡抓包命令tcpdump及分析工具wireshark使用

文章目錄 環境文檔用途詳細信息 環境 系統平臺&#xff1a;Linux x86-64 Red Hat Enterprise Linux 8,Linux x86-64 Red Hat Enterprise Linux 7,Linux x86-64 SLES 12,銀河麒麟 &#xff08;鯤鵬&#xff09;,銀河麒麟 &#xff08;X86_64&#xff09;,銀河麒麟&#xff08;龍…

Eigen矩陣存儲順序以及轉換

一、Eigen矩陣存儲順序 在矩陣運算和線性代數中,"行優先"(Row-major)和"列優先"(Column-major)是兩種不同的存儲方式,它們決定了多維數組(如矩陣)在內存中的布局順序。 1. 行優先(Row-major) 定義:矩陣按行順序存儲在內存中,即第一行的所有元…