SpringBoot3使用RestTemplate請求接口忽略SSL證書的問題解決
概述
我在項目中使用SpringBoot3版本+中RestTemplate請求接口時候報錯:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to fin
注意:springBoot3版本+RestTemplate對應的是spring-web-6.+版本舊版本不適用以下解決方案,構建RestTemplateConfigl類可能會找不到對應方法!?。?/p>
錯誤原因
在使用 RestTemplate 調用 HTTPS 接口時,出現(xiàn) PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 錯誤,通常是因為 Java 應用程序無法驗證服務器的 SSL 證書。
具體原因如下:
- 證書不受信任:Java 的默認信任庫(
cacerts)中沒有包含服務器使用的 SSL 證書或中間證書。Java 使用這個信任庫來驗證服務器的證書鏈。 - 自簽名證書:如果服務器使用的是自簽名證書,而不是由受信任的證書頒發(fā)機構(CA)簽發(fā)的證書,Java 默認不會信任這種證書。
- 證書鏈不完整:服務器的 SSL 證書鏈不完整,缺少中間證書,導致 Java 無法構建完整的證書路徑。
解決方案
1. 將服務器證書添加到 Java 的信任庫
如果服務器使用的是自簽名證書或不受信任的證書,可以將該證書添加到 Java 的信任庫中。
步驟:
獲取服務器證書:
- 使用瀏覽器訪問目標 HTTPS 接口,導出服務器的 SSL 證書。
- 或者使用
openssl命令獲取證書:
openssl s_client -connect <服務器地址>:443 -showcerts
將輸出中的證書部分保存為 .crt 文件。
將證書導入 Java 信任庫:
- 找到 Java 的
cacerts文件,通常位于$JAVA_HOME/lib/security/cacerts。 - 使用
keytool將證書導入信任庫:
keytool -import -trustcacerts -file <證書文件> -keystore $JAVA_HOME/lib/security/cacerts -alias <別名>
默認密碼是 changeit。
重啟應用程序:確保應用程序重新加載信任庫。
2. 忽略 SSL 證書驗證(不推薦)
如果你在開發(fā)環(huán)境中,且不關心證書驗證,可以臨時忽略 SSL 證書驗證。注意:這種方法不安全,不推薦在生產環(huán)境中使用。
步驟:
自定義 RestTemplate:
- 創(chuàng)建一個自定義的
SSLContext,忽略證書驗證。 - 使用
NoopHostnameVerifier忽略主機名驗證。
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;
}
/**
* 構造跳過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:
在調用 HTTPS 接口時,使用上述方法創(chuàng)建的 RestTemplate。
3. 使用受信任的證書
如果可能,建議使用由受信任的 CA 簽發(fā)的證書,而不是自簽名證書。這樣可以避免證書驗證問題。
總結
- 推薦方案:將服務器證書添加到 Java 的信任庫中,確保證書鏈完整且受信任。
- 臨時方案:在開發(fā)環(huán)境中,可以臨時忽略 SSL 證書驗證,但不建議在生產環(huán)境中使用。
- 最佳實踐:使用受信任的 CA 簽發(fā)的證書,確保 SSL/TLS 通信的安全性。
到此這篇關于SpringBoot3使用RestTemplate請求接口忽略SSL證書的問題解決的文章就介紹到這了,更多相關SpringBoot3 RestTemplate忽略SSL證書內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring MVC簡介_動力節(jié)點Java學院整理
Spring MVC屬于SpringFrameWork的后續(xù)產品,已經融合在Spring Web Flow里面。今天先從寫一個Spring MVC的HelloWorld開始,讓我們看看如何搭建起一個Spring mvc的環(huán)境并運行程序,感興趣的朋友一起學習吧2017-08-08
Mybatis查詢Sql結果未映射到對應得實體類上的問題解決
使用mybatis查詢表數據得時候,發(fā)現(xiàn)對應得實體類字段好多都是null,本文主要介紹了Mybatis查詢Sql結果未映射到對應得實體類上的問題解決,具有一定的參考價值,感興趣的可以了解一下2024-02-02

