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

Tomcat SSL 雙向認證完整配置指南:從證書生成到實戰驗證

     編輯:Java 綜合教學

Tomcat SSL 雙向認證完整配置指南:從證書生成到實戰驗證

一、SSL/TLS 基礎概念速覽

SSL (Secure Sockets Layer) 及其繼任者 TLS (Transport Layer Security) 是保障客戶端與服務端通信安全的標準協議。核心機制:

  • 握手階段:雙方協商加密套件、驗證身份、生成「會話密鑰」。
  • 數據傳輸:使用對稱加密的會話密鑰加密數據,兼顧安全與性能。
  • 雙向認證:服務端出示證書供客戶端驗證(單向);客戶端亦出示證書供服務端驗證(雙向),雙向確認身份,安全性更高。

二、使用 JDK Keytool 生成自簽名證書鏈

生產環境建議使用 CA 機構簽發證書(如 DigiCert、Let's Encrypt)。開發/測試環境可用自簽名證書,成本為零。以下所有操作在 F:\ca 目錄下進行,JDK 版本 1.7+。

1. 生成服務端密鑰對與自簽名證書

keytool -genkeypair -v -alias server -keyalg RSA -validity 3650 \
  -keystore ./server.keystore -storepass 123456 -keypass 123456 \
  -dname "CN=127.0.0.1,OU=rm,O=rm,L=gz,ST=gd,C=cn"

關鍵點:CN 必須設置為服務端的 IP 或域名,否則客戶端驗證會失敗。

2. 導出服務端公鑰證書

keytool -exportcert -alias server -keystore ./server.keystore \
  -file ./server.cer -storepass 123456

3. 創建服務端信任庫並導入服務端自簽證書

keytool -importcert -alias serverca -keystore ./server_trust.keystore \
  -file ./server.cer -storepass 123456

4. 生成客戶端密鑰對(PKCS12 格式,瀏覽器可直接導入)

keytool -genkeypair -v -alias client -dname "CN=rorymo" -keyalg RSA \
  -validity 3650 -keypass 123456 -keystore ./client.p12 \
  -storepass 123456 -storetype PKCS12

5. 導出客戶端公鑰證書

keytool -exportcert -alias client -file ./client.cer \
  -keystore ./client.p12 -storepass 123456 -storetype PKCS12

6. 將客戶端證書導入服務端信任庫

keytool -importcert -alias clientca -keystore ./server_trust.keystore \
  -file ./client.cer -storepass 123456

7. 驗證信任庫內容

keytool -list -keystore ./server_trust.keystore -storepass 123456

應看到 serverca 和 clientca 兩條受信任證書條目。

三、Tomcat 服務端配置

  1. 將 server.keystore 和 server_trust.keystore 複製到 Tomcat 根目錄(如 F:\ca\apache-tomcat-7.0.64)。
  2. 編輯 conf/server.xml,在 <Service> 下添加 Connector:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           SSLEnabled="true" maxThreads="150" scheme="https" secure="true"
           clientAuth="true" sslProtocol="TLS"
           keystoreFile="${catalina.base}/server.keystore"
           keystorePass="123456"
           truststoreFile="${catalina.base}/server_trust.keystore"
           truststorePass="123456" />

關鍵屬性解析:

  • clientAuth="true":啟用雙向認證(強制要求客戶端提供證書)。
  • keystoreFile:服務端私鑰證書庫(含私鑰)。
  • truststoreFile:服務端信任庫(含受信任的客戶端 CA 證書)。

四、Web 應用層配置:獲取客戶端證書信息

1. 編寫 Servlet 解析客戶端證書

@WebServlet("/SSLServlet")
public class SSLServlet extends HttpServlet {
    private static final String REQUEST_ATTR_CERT = "javax.servlet.request.X509Certificate";

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/plain;charset=UTF-8");
        PrintWriter out = resp.getWriter();

        X509Certificate[] certs = (X509Certificate[]) req.getAttribute(REQUEST_ATTR_CERT);
        if (certs != null) {
            out.println("檢測到 " + certs.length + " 個客戶端證書");
            for (int i = 0; i < certs.length; i++) {
                X509Certificate cert = certs[i];
                out.println("證書主體: " + cert.getSubjectDN());
                out.println("有效性: " + (verify(cert) ? "有效" : "已過期/無效"));
                out.println("詳細信息:\n" + cert.toString());
            }
        } else if ("https".equalsIgnoreCase(req.getScheme())) {
            out.println("HTTPS 請求,但無可用客戶端證書");
        } else {
            out.println("非 HTTPS 請求,無法獲取客戶端證書");
        }
    }

    private boolean verify(X509Certificate cert) {
        try { cert.checkValidity(); return true; }
        catch (Exception e) { return false; }
    }
}

2. 配置 web.xml 強制特定路徑使用 SSL

<security-constraint>
  <web-resource-collection>
    <web-resource-name>SSL</web-resource-name>
    <url-pattern>/SSLServlet</url-pattern>
  </web-resource-collection>
  <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
  </user-data-constraint>
</security-constraint>

僅對 /SSLServlet 強制 HTTPS,其他路徑保持 HTTP,兼顧安全與性能。

五、客戶端驗證實戰:瀏覽器導入證書與訪問測試

  1. 導入客戶端證書:雙擊 client.p12,按提示導入「個人」存儲區(Chrome/Edge 使用系統憑證存儲,Firefox 需在瀏覽器內導入)。
  2. 訪問測試:打開 https://127.0.0.1:8443/SSL/SSLServlet,瀏覽器彈窗選擇客戶端證書 → 確定。
  3. 解決服務端證書不受信任警告:將 server.cer 導入系統「受信任的根證書頒發機構」存儲區。重啟瀏覽器後再次訪問,地址欄顯示綠色安全鎖,無警告。

雙向認證成功頁面

六、附錄:Keytool 常用命令速查表

命令用途
-genkeypair生成密鑰對與自簽名證書
-exportcert導出公鑰證書文件
-importcert導入證書到信任庫
-list查看密鑰庫條目
-delete刪除條目
-keypasswd修改私鑰密碼
-storepasswd修改密鑰庫密碼

關鍵參數說明:-alias 別名、-dname 證書主體信息、-validity 有效天數、-storetype 庫類型(JKS/PKCS12)、-keypass 私鑰密碼、-storepass 庫密碼。

七、總結

本文完整演示了:自簽名 CA 體系構建、服務端/客戶端證書生成與信任鏈建立、Tomcat 雙向 SSL 配置、Web 層證書解析、瀏覽器端證書導入與驗證全流程。掌握此技能,可為內部系統、API 網關、管理後台提供強身份認證保障。

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