feign調(diào)用跳過(guò)HTTPS的SSL證書(shū)校驗(yàn)配置過(guò)程
一、問(wèn)題拋出
如果不配置跳過(guò)SSL證書(shū)校驗(yàn),當(dāng)Feign客戶端嘗試連接到一個(gè)使用自簽名證書(shū)的服務(wù)器時(shí),可能會(huì)拋出類似以下的異常:
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
二、原因分析
如果不添加跳過(guò)SSL證書(shū)校驗(yàn)的配置,Feign客戶端在調(diào)用HTTPS服務(wù)時(shí)會(huì)嚴(yán)格驗(yàn)證服務(wù)器的SSL證書(shū)。
這種行為是默認(rèn)且推薦的做法,因?yàn)樗梢源_保通信的安全性和完整性。
以下是如果不添加該配置的具體影響:
2.1 證書(shū)驗(yàn)證
默認(rèn)行為:Feign客戶端會(huì)使用系統(tǒng)的默認(rèn)TrustManager來(lái)驗(yàn)證服務(wù)器的SSL證書(shū)。
驗(yàn)證內(nèi)容:
- 證書(shū)有效性:檢查證書(shū)是否由受信任的證書(shū)頒發(fā)機(jī)構(gòu)(CA)簽發(fā)。
- 證書(shū)過(guò)期:確保證書(shū)在有效期內(nèi)。
- 證書(shū)鏈:驗(yàn)證證書(shū)鏈的完整性。
- 主機(jī)名匹配:確保證書(shū)中的主機(jī)名與請(qǐng)求的主機(jī)名匹配。
- 目的:驗(yàn)證服務(wù)器的身份,確保客戶端連接的是正確的服務(wù)器。
過(guò)程:
- 客戶端請(qǐng)求服務(wù)器的證書(shū)。
- 服務(wù)器返回證書(shū)。
- 客戶端驗(yàn)證證書(shū)的有效性,包括證書(shū)是否由受信任的CA簽發(fā)、證書(shū)是否過(guò)期等。
- 如果驗(yàn)證通過(guò),客戶端和服務(wù)器使用證書(shū)中的公鑰進(jìn)行密鑰交換,建立安全的通信通道。
2.2 影響
安全性增強(qiáng):確保數(shù)據(jù)傳輸?shù)陌踩院屯暾裕乐怪虚g人攻擊。
潛在問(wèn)題:
- 自簽名證書(shū):如果服務(wù)器使用自簽名證書(shū)或內(nèi)部
CA簽發(fā)的證書(shū),客戶端會(huì)拒絕連接,除非這些證書(shū)被顯式信任。 - 證書(shū)過(guò)期或無(wú)效:如果證書(shū)過(guò)期或無(wú)效,客戶端會(huì)拒絕連接。
- 主機(jī)名不匹配:如果證書(shū)中的主機(jī)名與請(qǐng)求的主機(jī)名不匹配,客戶端會(huì)拒絕連接。
三、解決方法-跳過(guò)SSL證書(shū)校驗(yàn)
風(fēng)險(xiǎn):跳過(guò)SSL證書(shū)校驗(yàn)會(huì)使得中間人攻擊成為可能,攻擊者可以攔截并篡改數(shù)據(jù)。
適用場(chǎng)景:僅在開(kāi)發(fā)和測(cè)試環(huán)境中使用,生產(chǎn)環(huán)境中應(yīng)嚴(yán)格配置和驗(yàn)證SSL證書(shū)。
實(shí)現(xiàn)方法:
- 創(chuàng)建一個(gè)自定義的
TrustManager,忽略證書(shū)校驗(yàn)。 - 配置自定義的
SSLSocketFactory和HostnameVerifier。
四、代碼配置,跳過(guò)SSL證書(shū)校驗(yàn)
@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);
}
}
五、總結(jié)
不添加跳過(guò)SSL證書(shū)校驗(yàn)的配置可以顯著提高安全性,但可能會(huì)導(dǎo)致連接失敗,特別是在使用自簽名證書(shū)或內(nèi)部CA證書(shū)的情況下。因此,建議在生產(chǎn)環(huán)境中正確配置和驗(yàn)證SSL證書(shū),而在開(kāi)發(fā)和測(cè)試環(huán)境中可以考慮使用跳過(guò)SSL證書(shū)校驗(yàn)的配置,但應(yīng)謹(jǐn)慎使用。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之查找
本文主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中查找的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03
SpringBoot項(xiàng)目使用?axis?調(diào)用webservice接口的實(shí)踐記錄
這篇文章主要介紹了SpringBoot項(xiàng)目使用?axis?調(diào)用webservice接口,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
利用Java實(shí)現(xiàn)讀取WPS?Excel中嵌入的圖片
許多數(shù)據(jù)文件中可能包含嵌入式圖片,這些圖片對(duì)于數(shù)據(jù)分析和可視化非常重要,下面我們就來(lái)看看如何使用Java讀取WPS?Excel中嵌入的圖片吧2024-11-11

