feign調用跳過HTTPS的SSL證書校驗配置過程
一、問題拋出
如果不配置跳過SSL證書校驗,當Feign客戶端嘗試連接到一個使用自簽名證書的服務器時,可能會拋出類似以下的異常:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
二、原因分析
如果不添加跳過SSL證書校驗的配置,Feign客戶端在調用HTTPS服務時會嚴格驗證服務器的SSL證書。
這種行為是默認且推薦的做法,因為它可以確保通信的安全性和完整性。
以下是如果不添加該配置的具體影響:
2.1 證書驗證
默認行為:Feign客戶端會使用系統(tǒng)的默認TrustManager來驗證服務器的SSL證書。
驗證內容:
- 證書有效性:檢查證書是否由受信任的證書頒發(fā)機構(CA)簽發(fā)。
- 證書過期:確保證書在有效期內。
- 證書鏈:驗證證書鏈的完整性。
- 主機名匹配:確保證書中的主機名與請求的主機名匹配。
- 目的:驗證服務器的身份,確??蛻舳诉B接的是正確的服務器。
過程:
- 客戶端請求服務器的證書。
- 服務器返回證書。
- 客戶端驗證證書的有效性,包括證書是否由受信任的CA簽發(fā)、證書是否過期等。
- 如果驗證通過,客戶端和服務器使用證書中的公鑰進行密鑰交換,建立安全的通信通道。
2.2 影響
安全性增強:確保數(shù)據(jù)傳輸?shù)陌踩院屯暾?,防止中間人攻擊。
潛在問題:
- 自簽名證書:如果服務器使用自簽名證書或內部
CA簽發(fā)的證書,客戶端會拒絕連接,除非這些證書被顯式信任。 - 證書過期或無效:如果證書過期或無效,客戶端會拒絕連接。
- 主機名不匹配:如果證書中的主機名與請求的主機名不匹配,客戶端會拒絕連接。
三、解決方法-跳過SSL證書校驗
風險:跳過SSL證書校驗會使得中間人攻擊成為可能,攻擊者可以攔截并篡改數(shù)據(jù)。
適用場景:僅在開發(fā)和測試環(huán)境中使用,生產環(huán)境中應嚴格配置和驗證SSL證書。
實現(xiàn)方法:
- 創(chuàng)建一個自定義的
TrustManager,忽略證書校驗。 - 配置自定義的
SSLSocketFactory和HostnameVerifier。
四、代碼配置,跳過SSL證書校驗
@Slf4j
@Configuration
public class FeignClientConfig {
@Bean
public Logger.Level feignLogLevel() {
return Logger.Level.FULL;
}
@Bean
public CachingSpringLoadBalancerFactory cachingFactory(SpringClientFactory clientFactory) {
return new CachingSpringLoadBalancerFactory(clientFactory);
}
@Bean
@ConditionalOnMissingBean
public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
SpringClientFactory clientFactory) throws NoSuchAlgorithmException, KeyManagementException {
SSLContext ctx = SSLContext.getInstance("SSL");
X509TrustManager tm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
};
ctx.init(null, new TrustManager[]{tm}, null);
return new LoadBalancerFeignClient(new Client.Default(ctx.getSocketFactory(),
HttpsURLConnection.getDefaultHostnameVerifier()),
cachingFactory, clientFactory);
}
}
五、總結
不添加跳過SSL證書校驗的配置可以顯著提高安全性,但可能會導致連接失敗,特別是在使用自簽名證書或內部CA證書的情況下。因此,建議在生產環(huán)境中正確配置和驗證SSL證書,而在開發(fā)和測試環(huán)境中可以考慮使用跳過SSL證書校驗的配置,但應謹慎使用。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot項目使用?axis?調用webservice接口的實踐記錄
這篇文章主要介紹了SpringBoot項目使用?axis?調用webservice接口,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06
利用Java實現(xiàn)讀取WPS?Excel中嵌入的圖片
許多數(shù)據(jù)文件中可能包含嵌入式圖片,這些圖片對于數(shù)據(jù)分析和可視化非常重要,下面我們就來看看如何使用Java讀取WPS?Excel中嵌入的圖片吧2024-11-11

