首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JRE 1.6 HTTPS 請求失敗:SNI 不支援導致 SSL 握手異常,升級至 1.8 解決

     編輯:Java 綜合教學

JRE 1.6 HTTPS 請求失敗:SNI 不支援導致 SSL 握手異常

使用 HttpURLConnection 請求 HTTPS 介面,拋出 SSLHandshakeException: PKIX path building failed。經排查,根因為 **JRE 1.6 不支援 SNI (Server Name Indication)**,導致 CDN 虛擬主機返回錯誤憑證。

問題重現

public String sendGet(String url) {
    URL realUrl = new URL(url);
    URLConnection connection = realUrl.openConnection();
    // ... 設定請求屬性 ...
    connection.connect();
    BufferedReader in = new BufferedReader(
        new InputStreamReader(connection.getInputStream(), "utf-8"));
    // ... 讀取回應 ...
}

錯誤堆疊:

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

排查過程

  1. 嘗試 keytool 匯入 CA 憑證 —— 無效,因憑證本身合法(GoDaddy 簽發)。
  2. 編寫獨立程式列印伺服器回傳憑證,發現**域名、憑證均非目標站點**,懷疑中間人攻擊或 CDN 配置錯誤。
  3. Wireshark 抓包確認:確為目標 CDN IP 回傳。
  4. 發現同 CDN 廠商其他站點在 IE7(不支援 SNI)下也呈現相同錯誤憑證,Firefox 正常。

根因分析:SNI (Server Name Indication)

**虛擬主機機制**:HTTP 靠 Host 標頭區分站點;HTTPS 握手階段尚未傳送 HTTP 標頭,需在 ClientHello 中攜帶域名 —— 即 SNI 擴展。

  • JRE 1.7+ 才支援 SNI。
  • JRE 1.6 發起 HTTPS 握手時不送 SNI,CDN 只能返回預設憑證(往往是共用 IP 下第一個站點的憑證),導致驗證失敗。

解決方案

升級 JRE 至 1.8 (或至少 1.7),重啟 Tomcat,問題即刻解決。

補充驗證

java -version
# 確認版本為 1.8.x
# 重新測試 HTTPS 請求,握手成功,返回正確內容
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved