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

JSSE 存取未驗證憑證的 HTTPS 站點:兩大解決方案完整實作(TrustStore 匯入 vs 自訂 X509TrustManager)

     編輯:Java 程式設計入門

問題背景

JSSE (Java Secure Socket Extension) 是純 Java 實作的 SSL/TLS 提供者。預設只信任經權威 CA 簽署的憑證。存取自簽或私有 CA 簽署的 HTTPS 站點(如校園網、內部系統)會拋出 javax.net.ssl.SSLException。

JSSE 信任機制核心:TrustStore 與 TrustManager

  • TrustStore:儲存受信任憑證的檔案(預設 jre/lib/security/cacerts 或 jssecacerts)。
  • TrustManager:決定是否信任遠端憑證的核心類別。
  • 系統屬性 javax.net.ssl.trustStore 可指定自訂 TrustStore。

方案一:將憑證匯入 TrustStore(適用於憑證固定、數量少)

步驟

  1. 瀏覽器匯出憑證(IE:網際網路選項 → 內容 → 憑證 → 匯出 → .cer)。
  2. 使用 keytool 匯入:
    keytool -import -file server.cer -keystore jssecacerts -storepass changeit
  3. 將 jssecacerts 放入 jre/lib/security/ 或啟動時指定:
    -Djavax.net.ssl.trustStore=path/to/jssecacerts -Djavax.net.ssl.trustStorePassword=changeit

優缺點

  • ✅ 程式碼零修改,標準 HttpsURLConnection 即可運作。
  • ❌ 憑證輪換需人工重複匯出/匯入,維運成本高。

方案二:自訂 X509TrustManager(適用於動態/大量/自動化場景)

核心介面

interface X509TrustManager {
  void checkClientTrusted(X509Certificate[] chain, String authType);
  void checkServerTrusted(X509Certificate[] chain, String authType);
  X509Certificate[] getAcceptedIssuers();
}

實作策略

  • checkClientTrusted:委派給預設 TrustManager(通常不需驗證客戶端)。
  • checkServerTrusted:空實作 = 信任所有伺服器憑證(⚠️ 生產環境極度不建議),或實作自訂驗證邏輯(如釘選公鑰、檢查主體 DN、驗證私有 CA 簽署鏈)。
  • getAcceptedIssuers:回傳空陣列或受信 CA 列表。

串接至 HttpsURLConnection

// 建立自訂 TrustManager
TrustManager[] tm = { new MyX509TrustManager() };

// 初始化 SSLContext
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tm, new SecureRandom());

// 取得自訂 SSLSocketFactory
SSLSocketFactory sf = ctx.getSocketFactory();

// 套用至連線
URL url = new URL("https://untrusted.example.com");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(sf);

// 後續正常讀取輸入流...

類別關係圖

HttpsURLConnection
      │
      ▼
SSLSocketFactory (由 SSLContext 產生)
      │
      ▼
SSLContext.init(keyManagers, trustManagers, secureRandom)
      │
      ▼
X509TrustManager (自訂實作)

安全性警示 ⚠️

生產環境嚴禁使用「信任所有憑證」的 TrustManager。 應改用憑證釘選或私有 CA 驗證,否則完全失去 TLS 防中間人攻擊的保護。

現代替代方案

  • Java 9+:jlink 客製化執行映像內建信任錨點。
  • 容器化部署:掛載共享 TrustStore volume、使用 cert-manager 自動輪換。
  • HTTP Client 升級:java.net.http.HttpClient (Java 11+) 或 Apache HttpClient 5 / OkHttp 提供更靈活的 SSL 設定 API。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved