SpringBoot3使用RestTemplate請(qǐng)求接口忽略SSL證書的問題解決
概述
我在項(xiàng)目中使用SpringBoot3版本+中RestTemplate請(qǐng)求接口時(shí)候報(bào)錯(cuò):
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to fin
注意:springBoot3版本+RestTemplate對(duì)應(yīng)的是spring-web-6.+版本舊版本不適用以下解決方案,構(gòu)建RestTemplateConfigl類可能會(huì)找不到對(duì)應(yīng)方法?。?!
錯(cuò)誤原因
在使用 RestTemplate 調(diào)用 HTTPS 接口時(shí),出現(xiàn) PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 錯(cuò)誤,通常是因?yàn)?Java 應(yīng)用程序無(wú)法驗(yàn)證服務(wù)器的 SSL 證書。
具體原因如下:
- 證書不受信任:Java 的默認(rèn)信任庫(kù)(
cacerts)中沒有包含服務(wù)器使用的 SSL 證書或中間證書。Java 使用這個(gè)信任庫(kù)來(lái)驗(yàn)證服務(wù)器的證書鏈。 - 自簽名證書:如果服務(wù)器使用的是自簽名證書,而不是由受信任的證書頒發(fā)機(jī)構(gòu)(CA)簽發(fā)的證書,Java 默認(rèn)不會(huì)信任這種證書。
- 證書鏈不完整:服務(wù)器的 SSL 證書鏈不完整,缺少中間證書,導(dǎo)致 Java 無(wú)法構(gòu)建完整的證書路徑。
解決方案
1. 將服務(wù)器證書添加到 Java 的信任庫(kù)
如果服務(wù)器使用的是自簽名證書或不受信任的證書,可以將該證書添加到 Java 的信任庫(kù)中。
步驟:
獲取服務(wù)器證書:
- 使用瀏覽器訪問目標(biāo) HTTPS 接口,導(dǎo)出服務(wù)器的 SSL 證書。
- 或者使用
openssl命令獲取證書:
openssl s_client -connect <服務(wù)器地址>:443 -showcerts
將輸出中的證書部分保存為 .crt 文件。
將證書導(dǎo)入 Java 信任庫(kù):
- 找到 Java 的
cacerts文件,通常位于$JAVA_HOME/lib/security/cacerts。 - 使用
keytool將證書導(dǎo)入信任庫(kù):
keytool -import -trustcacerts -file <證書文件> -keystore $JAVA_HOME/lib/security/cacerts -alias <別名>
默認(rèn)密碼是 changeit。
重啟應(yīng)用程序:確保應(yīng)用程序重新加載信任庫(kù)。
2. 忽略 SSL 證書驗(yàn)證(不推薦)
如果你在開發(fā)環(huán)境中,且不關(guān)心證書驗(yàn)證,可以臨時(shí)忽略 SSL 證書驗(yàn)證。注意:這種方法不安全,不推薦在生產(chǎn)環(huán)境中使用。
步驟:
自定義 RestTemplate:
- 創(chuàng)建一個(gè)自定義的
SSLContext,忽略證書驗(yàn)證。 - 使用
NoopHostnameVerifier忽略主機(jī)名驗(yàn)證。
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder;
import org.apache.hc.client5.http.ssl.TrustAllStrategy;
import org.apache.hc.core5.ssl.SSLContextBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() throws Exception {
HttpComponentsClientHttpRequestFactory factory = generateHttpRequestFactory();
factory.setConnectTimeout(15000);
factory.setConnectionRequestTimeout(5000);
return factory;
}
/**
* 構(gòu)造跳過SSL ClientHttp工廠
*
* @return
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
* @throws KeyStoreException
*/
public static HttpComponentsClientHttpRequestFactory generateHttpRequestFactory()
throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException {
CloseableHttpClient httpclient = HttpClients.custom()
.setConnectionManager(PoolingHttpClientConnectionManagerBuilder.create()
.setSSLSocketFactory(SSLConnectionSocketFactoryBuilder.create()
.setSslContext(SSLContextBuilder.create()
.loadTrustMaterial(TrustAllStrategy.INSTANCE)
.build())
.setHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.build())
.build())
.build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setHttpClient(httpclient);
return factory;
}
}使用自定義的 RestTemplate:
在調(diào)用 HTTPS 接口時(shí),使用上述方法創(chuàng)建的 RestTemplate。
3. 使用受信任的證書
如果可能,建議使用由受信任的 CA 簽發(fā)的證書,而不是自簽名證書。這樣可以避免證書驗(yàn)證問題。
總結(jié)
- 推薦方案:將服務(wù)器證書添加到 Java 的信任庫(kù)中,確保證書鏈完整且受信任。
- 臨時(shí)方案:在開發(fā)環(huán)境中,可以臨時(shí)忽略 SSL 證書驗(yàn)證,但不建議在生產(chǎn)環(huán)境中使用。
- 最佳實(shí)踐:使用受信任的 CA 簽發(fā)的證書,確保 SSL/TLS 通信的安全性。
到此這篇關(guān)于SpringBoot3使用RestTemplate請(qǐng)求接口忽略SSL證書的問題解決的文章就介紹到這了,更多相關(guān)SpringBoot3 RestTemplate忽略SSL證書內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot項(xiàng)目中引入本地依賴jar包并打包到lib文件夾中
這篇文章主要介紹了springboot項(xiàng)目中引入本地依賴jar包,如何打包到lib文件夾中,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
MyBatis編寫嵌套子查詢的動(dòng)態(tài)SQL實(shí)踐詳解
在Java生態(tài)中,MyBatis作為一款優(yōu)秀的ORM框架,廣泛應(yīng)用于數(shù)據(jù)庫(kù)操作,本文將深入探討如何在MyBatis中編寫嵌套子查詢的動(dòng)態(tài)SQL,并結(jié)合實(shí)際案例分析其應(yīng)用場(chǎng)景與實(shí)現(xiàn)技巧2025-06-06
springmvc與mybatis集成配置實(shí)例詳解
這篇文章主要介紹了springmvc與mybatis集成配置實(shí)例詳解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
2023最新版本idea用maven新建web項(xiàng)目(親測(cè)不報(bào)錯(cuò))
這篇文章主要給大家介紹了關(guān)于2023最新版本idea用maven新建web項(xiàng)目,Maven是當(dāng)今Java開發(fā)中主流的依賴管理工具,文中介紹的步驟親測(cè)不報(bào)錯(cuò),需要的朋友可以參考下2023-07-07
Spring boot中限制 Mybatis SQL日志的大字段輸出問題
文章介紹Springboot中MyBatis SQL日志因大字段輸出導(dǎo)致日志膨脹及JVM內(nèi)存問題,建議通過Logback或Log4j2自定義Converter/Filter實(shí)現(xiàn)參數(shù)截?cái)嗷蛎撁?或調(diào)整日志級(jí)別限制調(diào)試信息,本文給大家介紹Spring boot中限制Mybatis SQL日志的大字段輸出問題,感興趣的朋友一起看看吧2025-10-10
java報(bào)錯(cuò):“錯(cuò)誤:編碼GBK?的不可映射字符”解決辦法
當(dāng)Java源代碼中包含中文字符時(shí),我們?cè)谟胘avac編譯時(shí)會(huì)出現(xiàn)“錯(cuò)誤:編碼GBK的不可映射字符”,這篇文章主要給大家介紹了關(guān)于java報(bào)錯(cuò):“錯(cuò)誤:編碼GBK?的不可映射字符”的解決辦法,需要的朋友可以參考下2024-08-08
Java并發(fā)編程之常用的多線程實(shí)現(xiàn)方式分析
這篇文章主要介紹了Java并發(fā)編程之常用的多線程實(shí)現(xiàn)方式,結(jié)合實(shí)例形式分析了java并發(fā)編程中多線程的相關(guān)原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-02-02
springboot讀取bootstrap配置及knife4j版本兼容性問題及解決
這篇文章主要介紹了springboot讀取bootstrap配置及knife4j版本兼容性問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

