文章目錄
- Java HTTPS 請求失敗排查與證書導入全過程
- 問題背景
- 問題初步分析
- 排查過程
- 查看目標地址證書
- 導入證書
- 驗證證書是否導入成功
- 重啟應用
- 進一步驗證:是否真的是證書問題?
- 1. 瀏覽器訪問
- 2. 抓包工具驗證(如 Charles、Wireshark)
- 補充知識點
- ? Java 中默認信任庫在哪里?
- ? 如果要刪除已導入證書?
- ? 可否使用瀏覽器導出證書?
- 總結
- 生產上解決
Java HTTPS 請求失敗排查與證書導入全過程
在實際項目部署中,我們可能會遇到 Java 應用調用某個 HTTPS 接口失敗,特別是涉及公司網關(如 www.test.com
)或 WAF 防護設備時,問題常常集中在 SSL/TLS 證書驗證失敗上。本文記錄一次完整的排查過程,并給出相關知識點補充。
問題背景
Java 應用通過 java.net.HttpURLConnection
或 RestTemplate 等方式請求接口 https://www.test.com
,卻出現如下異常:
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
問題初步分析
該錯誤表明 Java 無法信任目標服務的 HTTPS 證書。常見原因有:
- 服務端證書是自簽名(Self-signed)
- 服務端證書鏈不完整
- Java SDK 默認的
cacerts
信任庫中缺少對應根證書或中間證書
特別注意:Java 不使用系統證書庫,而是依賴其內置的 cacerts
信任庫。
排查過程
查看目標地址證書
openssl s_client -connect www.test.com:443 -showcerts
可以看到目標返回了一整套證書鏈,包括:
- 服務器證書(.crt)
- 中間證書(可能有多個)
- 根證書(部分環境不提供)
導入證書
你可能收到運維/安全團隊提供的證書文件,如:
www.test.com_public.crt
www.test.com_chain.crt
www.test.com.key
我們只需要 .crt
文件,通常導入 www.test.com_chain.crt
即可。
導入命令如下(以 JDK 默認 cacerts
為例):
keytool -importcert \-trustcacerts \-alias test-gateway \-file www.test.com_chain.crt \-keystore $JAVA_HOME/lib/security/cacerts \-storepass changeit
驗證證書是否導入成功
keytool -list -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit | grep duola
輸出示例:
test-gateway, Jul 31, 2025, trustedCertEntry,
重啟應用
# 這是走默認的cacerts信任庫
java -jar my-test-project-0.0.1-SNAPSHOT.jar
# 下邊是指定我們導入的信任庫
java -Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit -jar my-test-project-0.0.1-SNAPSHOT.jar
此時如果請求成功,即可初步判定問題解決。
進一步驗證:是否真的是證書問題?
如果你懷疑是 WAF、CDN 等中間設備阻斷,可以用兩種方式驗證:
1. 瀏覽器訪問
瀏覽器訪問 https://www.test.com
是否提示 “證書不受信任”?如果沒有,一般說明服務器證書鏈是完整的,但 Java 環境中仍然缺少相應的中間證書。
2. 抓包工具驗證(如 Charles、Wireshark)
查看 TLS 握手過程是否被中斷或中間設備返回自定義證書。
補充知識點
? Java 中默認信任庫在哪里?
- 路徑:
$JAVA_HOME/lib/security/cacerts
- 默認密碼:
changeit
? 如果要刪除已導入證書?
keytool -delete -alias test-gateway -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit
? 可否使用瀏覽器導出證書?
可以。在瀏覽器中點擊鎖圖標 → 查看證書 → 導出為 .crt
文件,然后再導入 Java 信任庫。
總結
這次排查證明:
Java HTTPS 請求失敗,通常不是網絡或 WAF 問題,而是 Java 缺少可信證書鏈中的中間證書。
解決方法也非常明確:
- 獲取目標服務的完整證書鏈
- 將鏈中缺失的證書導入 Java 的 cacerts 信任庫
- 重啟應用驗證是否成功
如果你在實際部署中也遇到類似問題,不妨從證書入手,按圖索驥逐步排查。
生產上解決
證書等級提升,開始是從阿里云上夠買個人免費版證書,提升證書等級就行了