從 IIS (OpenSSL) 遷移雙向 SSL 證書到 Tomcat 8.5,單向輕鬆搞定,雙向卻掉進「無底坑」:cannot create new ssl、DerInputStream.getLength(): lengthTag=109, too big。本文還原完整踩坑路徑,揭示 Windows 下 keystore alias 必須為 tomcat 的隱形門檻。
server.xml 配置 keystoreFile/keystorePass/truststoreFile,啟動報 cannot create new ssl。.keystore,雙向認證通過,證明 Tomcat 配置邏輯無誤。openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 → keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -destkeystore server.keystore,放入 Tomcat 仍報錯。SSL context 初始化失敗,提示證書鏈可能已損壞(多次轉換導致)。# 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 不為 tomcat | SSL context 初始化失敗 / lengthTag=109 | Windows 下 JSSE 提供者硬編碼期望 alias=tomcat | 生成/導入時強制指定 -destalias tomcat 並 keyAlias="tomcat" |
| 證書鏈損壞 | cannot create new ssl | 同一組證書多次不同方式轉換/導入 | 每次實驗用新文件名、備份原始證書、從根 CA 重新簽發 |
| truststore 缺少客戶端 CA | 雙向握手失敗、客戶端憑證驗證錯誤 | truststore 未導入簽發客戶端證書的 CA | keytool -import -alias clientca -file ca.crt -keystore truststore.jks |
| 協議版本不匹配 | ClientHandshakeFailure | JDK 8 默認禁用 TLSv1/TLSv1.1 | jdk.tls.client.protocols=TLSv1.2,TLSv1.3 或升級 JDK |
server_20240101.p12、truststore_ca_v2.jks,避免覆蓋混淆。openssl s_client -connect localhost:8443 -cert client.crt -key client.key -CAfile ca.crt 一鍵驗證雙向握手。雙向 SSL 遷移看似配置活,實則是「證書格式、平台特性、工具鏈一致性」的綜合考驗。記住 Windows + Tomcat = alias 必須 tomcat,能省你幾個通宵。