JSSE (Java Secure Socket Extension) 是純 Java 實作的 SSL/TLS 提供者。預設只信任經權威 CA 簽署的憑證。存取自簽或私有 CA 簽署的 HTTPS 站點(如校園網、內部系統)會拋出 javax.net.ssl.SSLException。
jre/lib/security/cacerts 或 jssecacerts)。javax.net.ssl.trustStore 可指定自訂 TrustStore。.cer)。keytool 匯入:
keytool -import -file server.cer -keystore jssecacerts -storepass changeit
jssecacerts 放入 jre/lib/security/ 或啟動時指定:
-Djavax.net.ssl.trustStore=path/to/jssecacerts -Djavax.net.ssl.trustStorePassword=changeit
interface X509TrustManager {
void checkClientTrusted(X509Certificate[] chain, String authType);
void checkServerTrusted(X509Certificate[] chain, String authType);
X509Certificate[] getAcceptedIssuers();
}
checkClientTrusted:委派給預設 TrustManager(通常不需驗證客戶端)。checkServerTrusted:空實作 = 信任所有伺服器憑證(⚠️ 生產環境極度不建議),或實作自訂驗證邏輯(如釘選公鑰、檢查主體 DN、驗證私有 CA 簽署鏈)。getAcceptedIssuers:回傳空陣列或受信 CA 列表。// 建立自訂 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 防中間人攻擊的保護。
jlink 客製化執行映像內建信任錨點。cert-manager 自動輪換。java.net.http.HttpClient (Java 11+) 或 Apache HttpClient 5 / OkHttp 提供更靈活的 SSL 設定 API。