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

Java 獲取 HTTPS 證書並調用 WebService 完整指南:InstallCert 實戰

     編輯:Java 相關知識

調用 HTTPS WebService 時,若服務端證書不在 JDK 信任庫中,會拋出 SSLHandshakeException: PKIX path building failed。本文提供完整解決方案:使用 InstallCert 獲取證書 → 導入信任庫 → 配置調用端驗證。

步驟一:編寫 InstallCert 工具類

核心邏輯:建立 SSL 連接 → 捕獲服務端證書鏈 → 交互式選擇導入 jssecacerts 文件。

public class InstallCert {
    public static void main(String[] args) throws Exception {
        // 1. 解析參數 host:port [passphrase]
        // 2. 定位信任庫:優先 ./jssecacerts → $JAVA_HOME/lib/security/jssecacerts → cacerts
        // 3. 初始化 SSLContext,掛載自定義 TrustManager 捕獲證書鏈
        // 4. 建立 SSLSocket 連接目標主機,執行 startHandshake()
        // 5. 列出證書鏈詳情(Subject、Issuer、SHA1、MD5)
        // 6. 用戶選擇導入哪個證書,寫入 jssecacerts
    }
}

關鍵技術點

  • SavingTrustManager:包裝默認 X509TrustManager,在 checkServerTrusted 時攔截證書鏈
  • MessageDigest:計算 SHA1/MD5 指紋供人工核對
  • KeyStore:操作 jssecacerts 文件,setCertificateEntry 添加信任條目

步驟二:運行獲取證書

# Eclipse 運行配置
Main class: com.InstallCert
Program arguments: www.baidu.com 443 changeit
# 或直接域名,默認端口 443、密碼 changeit

控制台交互流程

  1. 顯示加載的 KeyStore 路徑
  2. SSL 握手失敗(預期),打印異常堆棧
  3. 列出服務端證書鏈(通常 1-3 張)
  4. 提示 Enter certificate to add to trusted keystore or 'q' to quit: [1]
  5. 輸入序號(如 1)回車,生成 jssecacerts 於項目目錄

步驟三:部署證書到運行環境

將生成的 jssecacerts 複製到 JDK 信任庫目錄:

# Windows 示例
copy jssecacerts "C:\Program Files\Java\jdk1.8.0_xxx\jre\lib\security\"
# Linux/Mac
cp jssecacerts $JAVA_HOME/jre/lib/security/

步驟四:調用端配置信任庫與主機名驗證

static {
    // 1. 主機名驗證器:允許目標域名
    HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> 
        "www.baidu.com".equals(hostname)
    );
    
    // 2. 指定信任庫路徑與密碼
    System.setProperty("javax.net.ssl.trustStore", 
        "C:\\Program Files\\Java\\jdk1.8.0_xxx\\jre\\lib\\security\\jssecacerts");
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
}

常見問題排查

現象原因解決
仍報 PKIX path building failedtrustStore 路徑錯誤或未生效檢查路徑、確認 JVM 讀取到該文件(-Djavax.net.debug=ssl 排查)
Hostname verification failed證書 CN/SAN 不匹配請求域名HostnameVerifier 返回 true、或證書包含正確域名
憑證過期/未生效系統時間錯或證書確實過期同步時間、更新證書

原理補充

  • JSSE 架構:SSLContext → TrustManager[] → X509TrustManager 驗證服務端證書
  • 信任庫鏈:jssecacerts 優先於 cacerts,應用層證書隔離於系統級
  • 主機名驗證:防止中間人攻擊,驗證證書 SubjectAltName 包含請求域名

總結

HTTPS 調用失敗 90% 為證書信任問題。InstallCert 是 JDK 官方提供的經典工具,掌握「獲取→導入→配置」三步曲,配合 -Djavax.net.debug=ssl 調試,可解決絕大多數握手失敗場景。生產環境建議使用正規 CA 簽發證書,避免自簽名證書維護成本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved