首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Tomcat 8.5 雙向 SSL 認證:OpenSSL 證書遷移踩坑實錄與 Windows 下 alias 必須為 tomcat 的殘酷真相

     編輯:程式設計疑難解答

從 IIS (OpenSSL) 遷移雙向 SSL 證書到 Tomcat 8.5,單向輕鬆搞定,雙向卻掉進「無底坑」:cannot create new ssl、DerInputStream.getLength(): lengthTag=109, too big。本文還原完整踩坑路徑,揭示 Windows 下 keystore alias 必須為 tomcat 的隱形門檻。

環境基線

  • Tomcat 8.5.5
  • OpenSSL 1.0.2j
  • JDK 8u73
  • 已在 IIS 上驗證雙向認證通過

踩坑時間線

  1. 參考博客配置: 依照 server.xml 配置 keystoreFile/keystorePass/truststoreFile,啟動報 cannot create new ssl。
  2. 改用 Keytool 重建: 用 Keytool 生成 .keystore,雙向認證通過,證明 Tomcat 配置邏輯無誤。
  3. 嘗試轉換 OpenSSL 證書: openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 → keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -destkeystore server.keystore,放入 Tomcat 仍報錯。
  4. 對比 Keytool 生成的可用 keystore: 私鑰長度均為 2048,排除「私鑰過長」說法。
  5. 重新按官方文檔生成: 錯誤變為 SSL context 初始化失敗,提示證書鏈可能已損壞(多次轉換導致)。
  6. 關鍵突破: 發現前輩博客提到 Windows 環境下 keystore alias 必須為 "tomcat",修改 alias 後立即通過。

核心解決方案

# 1. 確保 alias 為 tomcat(關鍵!)
keytool -importkeystore \
  -srckeystore server.p12 -srcstoretype PKCS12 -srcalias 1 \
  -destkeystore server.keystore -deststoretype JKS -destalias tomcat

# 2. server.xml 配置
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
           clientAuth="true" sslProtocol="TLS"
           keystoreFile="conf/server.keystore"
           keystorePass="your_keystore_password"
           truststoreFile="conf/truststore.jks"
           truststorePass="your_truststore_password"
           keyAlias="tomcat" />  <!-- 显式指定 alias -->

避坑總結

坑點表現根因對策
alias 不為 tomcatSSL context 初始化失敗 / lengthTag=109Windows 下 JSSE 提供者硬編碼期望 alias=tomcat生成/導入時強制指定 -destalias tomcat 並 keyAlias="tomcat"
證書鏈損壞cannot create new ssl同一組證書多次不同方式轉換/導入每次實驗用新文件名、備份原始證書、從根 CA 重新簽發
truststore 缺少客戶端 CA雙向握手失敗、客戶端憑證驗證錯誤truststore 未導入簽發客戶端證書的 CAkeytool -import -alias clientca -file ca.crt -keystore truststore.jks
協議版本不匹配ClientHandshakeFailureJDK 8 默認禁用 TLSv1/TLSv1.1jdk.tls.client.protocols=TLSv1.2,TLSv1.3 或升級 JDK

教訓與最佳實踐

  • 證書文件命名帶版本/用途: server_20240101.p12、truststore_ca_v2.jks,避免覆蓋混淆。
  • 首選 Keytool 全鏈路生成: 避免 OpenSSL↔JKS 轉換損耗,除非有跨平台強需求。
  • Windows 生產環境慎用: 此類平台特定坑(alias=tomcat)在 Linux/Unix 不存在,建議生產跑 Linux 容器。
  • 驗證腳本自動化: openssl s_client -connect localhost:8443 -cert client.crt -key client.key -CAfile ca.crt 一鍵驗證雙向握手。

雙向 SSL 遷移看似配置活,實則是「證書格式、平台特性、工具鏈一致性」的綜合考驗。記住 Windows + Tomcat = alias 必須 tomcat,能省你幾個通宵。

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