feign調(diào)用跳過HTTPS的SSL證書校驗(yàn)配置過程
一、問題拋出
如果不配置跳過SSL證書校驗(yàn),當(dāng)Feign客戶端嘗試連接到一個(gè)使用自簽名證書的服務(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
二、原因分析
如果不添加跳過SSL證書校驗(yàn)的配置,Feign客戶端在調(diào)用HTTPS服務(wù)時(shí)會(huì)嚴(yán)格驗(yàn)證服務(wù)器的SSL證書。
這種行為是默認(rèn)且推薦的做法,因?yàn)樗梢源_保通信的安全性和完整性。
以下是如果不添加該配置的具體影響:
2.1 證書驗(yàn)證
默認(rèn)行為:Feign客戶端會(huì)使用系統(tǒng)的默認(rèn)TrustManager來驗(yàn)證服務(wù)器的SSL證書。
驗(yàn)證內(nèi)容:
- 證書有效性:檢查證書是否由受信任的證書頒發(fā)機(jī)構(gòu)(CA)簽發(fā)。
- 證書過期:確保證書在有效期內(nèi)。
- 證書鏈:驗(yàn)證證書鏈的完整性。
- 主機(jī)名匹配:確保證書中的主機(jī)名與請(qǐng)求的主機(jī)名匹配。
- 目的:驗(yàn)證服務(wù)器的身份,確??蛻舳诉B接的是正確的服務(wù)器。
過程:
- 客戶端請(qǐng)求服務(wù)器的證書。
- 服務(wù)器返回證書。
- 客戶端驗(yàn)證證書的有效性,包括證書是否由受信任的CA簽發(fā)、證書是否過期等。
- 如果驗(yàn)證通過,客戶端和服務(wù)器使用證書中的公鑰進(jìn)行密鑰交換,建立安全的通信通道。
2.2 影響
安全性增強(qiáng):確保數(shù)據(jù)傳輸?shù)陌踩院屯暾?,防止中間人攻擊。
潛在問題:
- 自簽名證書:如果服務(wù)器使用自簽名證書或內(nèi)部
CA簽發(fā)的證書,客戶端會(huì)拒絕連接,除非這些證書被顯式信任。 - 證書過期或無效:如果證書過期或無效,客戶端會(huì)拒絕連接。
- 主機(jī)名不匹配:如果證書中的主機(jī)名與請(qǐng)求的主機(jī)名不匹配,客戶端會(huì)拒絕連接。
三、解決方法-跳過SSL證書校驗(yàn)
風(fēng)險(xiǎn):跳過SSL證書校驗(yàn)會(huì)使得中間人攻擊成為可能,攻擊者可以攔截并篡改數(shù)據(jù)。
適用場(chǎng)景:僅在開發(fā)和測(cè)試環(huán)境中使用,生產(chǎn)環(huán)境中應(yīng)嚴(yán)格配置和驗(yàn)證SSL證書。
實(shí)現(xiàn)方法:
- 創(chuàng)建一個(gè)自定義的
TrustManager,忽略證書校驗(yàn)。 - 配置自定義的
SSLSocketFactory和HostnameVerifier。
四、代碼配置,跳過SSL證書校驗(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é)
不添加跳過SSL證書校驗(yàn)的配置可以顯著提高安全性,但可能會(huì)導(dǎo)致連接失敗,特別是在使用自簽名證書或內(nèi)部CA證書的情況下。因此,建議在生產(chǎn)環(huán)境中正確配置和驗(yàn)證SSL證書,而在開發(fā)和測(cè)試環(huán)境中可以考慮使用跳過SSL證書校驗(yàn)的配置,但應(yīng)謹(jǐn)慎使用。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java去除集合中重復(fù)元素示例分享 java去除重復(fù)
這篇文章主要介紹了java去除集合中重復(fù)元素示例,大家參考使用吧2014-01-01
淺談Java鎖的膨脹過程以及一致性哈希對(duì)鎖膨脹的影響
本文主要介紹了Java鎖的膨脹過程以及一致性哈希對(duì)鎖膨脹的影響,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Java的Spring框架中bean的繼承與內(nèi)部bean的注入
這篇文章主要介紹了Java的Spring框架中bean的繼承與內(nèi)部bean的注入,Spring框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
Java 9中如何對(duì)IntegerCache進(jìn)行修改詳解
這篇文章主要給大家介紹了關(guān)于Java 9中如何對(duì)IntegerCache進(jìn)行修改的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用java9具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧。2017-12-12
IDEA啟動(dòng)Springboot報(bào)錯(cuò):無效的目標(biāo)發(fā)行版:17 的解決辦法
這篇文章主要給大家介紹了IDEA啟動(dòng)Springboot報(bào)錯(cuò):無效的目標(biāo)發(fā)行版:17 的解決辦法,文中通過代碼示例和圖文講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02
基于ReentrantLock的實(shí)現(xiàn)原理講解
這篇文章主要介紹了ReentrantLock的實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09

