RestTemplate Https 證書訪問錯誤

錯誤信息

resttemplate I/O error on GET request for “https://21.24.6.6:9443/authn-api/v5/oauth/token”: java.security.cert.CertificateException: No subject alternative names present; nested exception is javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present

這個錯誤是由于 SSL/TLS 握手失敗引起的,具體原因是服務器的 SSL 證書無效或不受信任。錯誤信息 No subject alternative names present 表示服務器的證書中沒有包含與請求的域名匹配的主題備用名稱(Subject Alternative Name, SAN)。

以下是解決此問題的幾種方法:

1. 檢查服務器證書

確保服務器的 SSL 證書是有效的,并且包含正確的主機名(即請求的域名)。可以通過以下步驟檢查證書:

  • 使用瀏覽器訪問服務器的 URL(例如 https://21.24.6.6:9443),查看證書的詳細信息。

  • 確保證書的 Subject Alternative Name (SAN) 包含請求的域名或 IP 地址。

如果證書無效或不匹配,需要聯系服務器管理員更新證書。

2. 忽略 SSL 證書驗證(僅用于測試環境)

在生產環境中不建議使用此方法,但在測試環境中可以臨時忽略 SSL 證書驗證。

使用 RestTemplate 忽略 SSL 驗證

import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;public class RestTemplateExample {public static void main(String[] args) throws Exception {// 創建忽略 SSL 驗證的 RestTemplateRestTemplate restTemplate = createRestTemplateWithIgnoreSSL();// 發送請求String url = "https://21.24.6.6:9443/authn-api/v5/oauth/token";String response = restTemplate.getForObject(url, String.class);System.out.println("Response: " + response);}private static RestTemplate createRestTemplateWithIgnoreSSL() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {// 創建 SSLContext,忽略證書驗證SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (certificate, authType) -> true) // 信任所有證書.build();// 創建 HttpClientCloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) // 忽略主機名驗證.build();// 創建 RestTemplateHttpComponentsClientHttpRequestFactory requestFactory =new HttpComponentsClientHttpRequestFactory(httpClient);return new RestTemplate(requestFactory);}
}

3. 使用自定義信任庫

如果服務器使用的是自簽名證書或私有 CA 簽發的證書,可以將證書導入 Java 的信任庫(cacerts)或自定義信任庫。

步驟:

  1. 導出服務器的證書:

    • 使用瀏覽器訪問服務器的 URL,導出證書(通常為 .crt 或 .pem 格式)。

    • 或者使用 openssl 命令導出證書:

openssl s_client -connect 21.24.6.6:9443 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM > server.crt
  1. 將證書導入 Java 信任庫:
    • 找到 Java 的默認信任庫(通常位于$JAVA_HOME/lib/security/cacerts)。

    • 使用 keytool 將證書導入信任庫:

keytool -import -trustcacerts -file server.crt -keystore $JAVA_HOME/lib/security/cacerts -alias server_cert
- 默認密碼是 changeit。
  1. 配置 RestTemplate 使用自定義信任庫:
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;import javax.net.ssl.SSLContext;
import java.io.FileInputStream;
import java.security.KeyStore;public class RestTemplateExample {public static void main(String[] args) throws Exception {// 創建使用自定義信任庫的 RestTemplateRestTemplate restTemplate = createRestTemplateWithCustomTrustStore();// 發送請求String url = "https://21.24.6.6:9443/authn-api/v5/oauth/token";String response = restTemplate.getForObject(url, String.class);System.out.println("Response: " + response);}private static RestTemplate createRestTemplateWithCustomTrustStore() throws Exception {// 加載自定義信任庫KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());try (FileInputStream fis = new FileInputStream("path/to/truststore.jks")) {trustStore.load(fis, "password".toCharArray());}// 創建 SSLContextSSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(trustStore, null) // 使用自定義信任庫.build();// 創建 HttpClientCloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build();// 創建 RestTemplateHttpComponentsClientHttpRequestFactory requestFactory =new HttpComponentsClientHttpRequestFactory(httpClient);return new RestTemplate(requestFactory);}
}

4. 檢查服務器配置

如果服務器配置了 SNI(Server Name Indication),確保客戶端支持 SNI。某些舊版本的 Java 可能不支持 SNI,可以嘗試升級 Java 版本。

5. 使用 WebClient 替代 RestTemplate

如果使用的是 Spring WebFlux,可以考慮使用 WebClient,它提供了更靈活的 SSL 配置選項。
示例:

import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;public class WebClientExample {public static void main(String[] args) throws NoSuchAlgorithmException, KeyManagementException {// 創建忽略 SSL 驗證的 WebClientWebClient webClient = WebClient.builder().baseUrl("https://21.24.6.6:9443").build();// 發送請求Mono<String> response = webClient.get().uri("/authn-api/v5/oauth/token").retrieve().bodyToMono(String.class);response.subscribe(body -> System.out.println("Response: " + body));}
}

總結

  • 如果服務器證書無效或不匹配,需要更新證書。
  • 在測試環境中可以臨時忽略 SSL 驗證,但不建議在生產環境中使用。
  • 對于自簽名證書或私有 CA 簽發的證書,可以將證書導入 Java 信任庫或自定義信任庫。
  • 如果問題仍然存在,可以嘗試使用 WebClient 替代 RestTemplate。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895069.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

講人話的理解ai學習原理

通過把各種東西打上分數標簽存起來。ai不花算力是不可能的&#xff0c;需要巨大的算力&#xff0c;需要要大量gpu芯片&#xff0c;如果大大降低成本&#xff0c;就需要蒸餾別人成果&#xff0c;把這些參數偷偷弄過來。 比如”貓睡在石頭上感覺很涼快&#xff0c;很舒服&#x…

【雜談】-文明的量子躍遷:AI時代人類物種的自我重構

文章目錄 文明的量子躍遷&#xff1a;AI時代人類物種的自我重構一、文明基因的雙螺旋進化二、意識矩陣的拓撲重構三、倫理穹頂下的共生協議 文明的量子躍遷&#xff1a;AI時代人類物種的自我重構 在撒哈拉沙漠的巖壁上&#xff0c;史前人類用赭石顏料繪制出羚羊與獵人的身影&a…

vue3 點擊圖標從相冊選擇二維碼圖片,并使用jsqr解析二維碼(含crypto-js加密解密過程)

vue3 點擊圖標從相冊選擇二維碼圖片&#xff0c;并使用jsqr解析二維碼&#xff08;含crypto-js加密解密過程&#xff09; 1.安裝 jsqr 和 crypto-js npm install -d jsqr npm install crypto-js2.在util目錄下新建encryptionHelper.js文件&#xff0c;寫加密解密方法。 // e…

支持多種網絡數據庫格式的自動化轉換工具——VisualXML

一、VisualXML軟件介紹 對于DBC、ARXML……文件的編輯、修改等繁瑣操作&#xff0c;WINDHILL風丘科技開發的總線設計工具——VisualXML&#xff0c;可輕松解決這一問題&#xff0c;提升工作效率。 VisualXML是一個強大且基于Excel表格生成多種網絡數據庫文件的轉換工具&#…

【JVM詳解四】執行引擎

一、概述 Java程序運行時&#xff0c;JVM會加載.class字節碼文件&#xff0c;但是字節碼并不能直接運行在操作系統之上&#xff0c;而JVM中的執行引擎就是負責將字節碼轉化為對應平臺的機器碼讓CPU運行的組件。 執行引擎是JVM核心的組成部分之一。可以把JVM架構分成三部分&am…

C++ 順序表

順序表的操作有以下&#xff1a; 1 順序表的元素插入 給定一個索引和元素&#xff0c;這個位置往后的元素位置都要往后移動一次&#xff0c;元素插入的步驟有以下幾步 &#xff08;1&#xff09;判斷插入的位置是否合法&#xff0c;如果不合法則拋出異常 &#xff08;2&…

mysql安裝starting the server報錯

win10家庭版無法啟動服務的&#xff0c;先不要退出&#xff0c;返回上一欄&#xff0c;然后通過電腦搜索欄輸入服務兩個字&#xff0c;在里面找到mysql80&#xff0c;右鍵屬性-登錄&#xff0c;登錄身份切換為本地系統就行了

萬有的函數關係速成2. 連續和導數

1.討論間斷點類型 定義: 若函數在某點不滿足連續的條件,則該點為間斷點。 第一類間斷點是左右極限都存在的間斷點,其中左右極限相等的是可去間斷點,不相等的是跳躍間斷點; 第二類間斷點是左右極限至少有一個不存在的間斷點,包括無窮間斷點(極限為無窮)和振蕩間斷點…

【專題】2025年我國機器人產業發展形勢展望:人形機器人量產及商業化關鍵挑戰報告匯總PDF洞察(附原數據表)

原文鏈接&#xff1a;https://tecdat.cn/?p39668 機器人已廣泛融入我們生活的方方面面。在工業領域&#xff0c;它們宛如不知疲倦的工匠&#xff0c;精準地完成打磨、焊接等精細工作&#xff0c;極大提升了生產效率和產品質量&#xff1b;在日常生活里&#xff0c;它們是貼心…

用docker在本地用open-webui部署網頁版deepseek

前置條件 用Ollama在本地CMD窗口運行deepseek大模型-CSDN博客文章瀏覽閱讀109次&#xff0c;點贊5次&#xff0c;收藏2次。首次運行需要下載deepseek的大模型包&#xff08;大約5GB&#xff0c;根據本地網速的不同在半個小時到幾個小時之間下載完成&#xff09; &#xff0c;并…

android的DataBinding簡介

Android DataBinding 簡介 DataBinding 是 Android Jetpack 中的數據綁定庫&#xff0c;用于將 UI 組件直接與數據模型綁定&#xff0c;減少模板代碼并實現雙向數據同步。它通過聲明式布局簡化 UI 更新邏輯&#xff0c;常用于 MVVM&#xff08;Model-View-ViewModel&#xff0…

企業如何利用DeepSeek提升網絡安全管理水平

企業可以通過深度整合DeepSeek的AI能力&#xff0c;構建智能化、動態化的網絡安全防御體系&#xff0c;以應對APT&#xff08;高級持續性威脅&#xff09;等復雜攻擊。以下是具體策略與實踐路徑&#xff1a; 1. AI驅動的威脅檢測與分析 多模態威脅狩獵 DeepSeek的深度學習技術能…

DeepSeek-R1 云環境搭建部署流程

DeepSeek橫空出世&#xff0c;在國際AI圈備受關注&#xff0c;作為個人開發者&#xff0c;AI的應用可以有效地提高個人開發效率。除此之外&#xff0c;DeepSeek的思考過程、思考能力是開放的&#xff0c;這對我們對結果調優有很好的幫助效果。 DeepSeek是一個基于人工智能技術…

x小兔鮮vue.js

LayoutFooter.vue <template><footer class"app_footer"><!-- 聯系我們 --><div class"contact"><div class"container"><dl><dt>客戶服務</dt><dd><i class"iconfont icon-kef…

磁盤分區損壞:深度解析與數據恢復策略

一、磁盤分區損壞現象概述 磁盤分區損壞是計算機數據存儲領域的一個常見問題&#xff0c;它通常表現為硬盤上的某個分區無法正常訪問&#xff0c;數據讀寫失敗&#xff0c;甚至整個分區消失。這種損壞可能源于多種因素&#xff0c;不僅影響用戶的正常使用&#xff0c;更可能導…

fetch請求總結,fastadmin中后臺接口強制返回json數據

fetch請求 提交圖片,只支持formData方式,這樣會自動變為multiform方式,而且一般的post大多都可以用這樣的方式來完成請求 const formData new FormData(); formData.append(file, fileInput.files[0]); formData.append(pid, id); formData.append(dc, 1);fetch(/api/common…

Python----Python高級(網絡編程:網絡基礎:發展歷程,IP地址,MAC地址,域名,端口,子網掩碼,網關,URL,DHCP,交換機)

一、網絡 早期的計算機程序都是在本機上運行的&#xff0c;數據存儲和處理都在同一臺機器上完成。隨著技術的發展&#xff0c;人 們開始有了讓計算機之間相互通信的需求。例如安裝在個人計算機上的計算器或記事本應用&#xff0c;其運行環 境僅限于個人計算機內部。這種設置雖然…

k8sollama部署deepseek-R1模型,內網無坑

這是目錄 linux下載ollama模型文件下載到本地,打包遷移到k8s等無網絡環境使用下載打包ollama鏡像非k8s環境使用k8s部署訪問方式非ollama運行deepseek模型linux下載ollama 下載后可存放其他服務器 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linu…

機器學習基本概念(附代碼)

這里的“機器”指的是計算機軟硬件組織&#xff0c;而非傳統的機械裝置&#xff1b;而“學習”&#xff0c;則是指軟件通過訓練過程&#xff0c;其性能得以提升的過程。 一、算法與模型的關系 在機器學習領域&#xff0c;算法和模型是兩個核心概念。算法是一種偏抽象的概念&a…

前端開發知識梳理 - HTMLCSS

1. 盒模型 由內容區&#xff08;content&#xff09;、內邊距&#xff08;padding&#xff09;、邊框&#xff08;border&#xff09;和外邊距&#xff08;margin&#xff09;組成。 &#xff08;1&#xff09;標準盒模型&#xff08;box-sizing默認值, content-box&#xff…