SSL(Secure Socket Layer)及其繼任者 TLS,通過加密傳輸與身份認證雙重機制,保障瀏覽器與伺服器通訊安全。本文詳細記錄 Tomcat 配置 HTTPS 的完整流程,從開發測試用的自簽證書到生產環境 CA 證書部署。
keytool 生成,無 CA 背書,瀏覽器報警,適合開發/測試/內網%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA \
-keystore D:\certs\localhost.keystore -storepass changeit \
-keypass changeit -validity 365 \
-dname "CN=localhost, OU=Dev, O=MyOrg, L=City, ST=State, C=CN"
| 參數 | 說明 | 建議值 |
|---|---|---|
-keyalg RSA | 非對稱加密算法 | RSA(兼容性最佳) |
-alias | 密鑰庫條目別名 | tomcat |
-keystore | 密鑰庫文件路徑 | 專用目錄,非用戶主目錄 |
-storepass | 密鑰庫訪問密碼 | 生產環境必須修改強密碼 |
-keypass | 私鑰密碼 | 必須與 storepass 相同(Tomcat 限制) |
-validity | 有效天數 | 365(測試)或更長 |
-dname | 證書主體信息(X.500) | CN=訪問域名(關鍵!) |
keytool -certreq -alias tomcat -file certreq.csr -keystore ...keytool -import -alias root -trustcacerts -file root.crt -keystore ...(依次導入根、中間、域名)$CATALINA_HOME/conf/server.xml
<Connector
port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
SSLEnabled="true"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
keystoreFile="D:/certs/localhost.keystore"
keystorePass="changeit"
keystoreType="JKS"
ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384"
/>
protocol:建議使用 NIO2 非阻塞協議(高併發性能更好)keystoreFile/keystorePass:必須顯式指定,否則 Tomcat 尋找用戶主目錄 .keystoreciphers:強烈建議顯式配置,禁用弱加密套件(RC4、DES、3DES、CBC 模式),優先 ECDHE 前向保密sslProtocol="TLS":支援 TLS 1.0/1.1/1.2/1.3(視 JDK 版本),不建議指定 SSLv3重啟 Tomcat,瀏覽器訪問:https://localhost:8443
| 現象 | 原因 | 解決 |
|---|---|---|
啟動報 IOException: Keystore was tampered | 密碼錯誤 | 核對 keystorePass、keypass 是否一致 |
| 瀏覽器提示「證書域名不匹配」 | CN ≠ 訪問域名 | 重新生成證書,-dname "CN=實際訪問域名" |
| HTTPS 頁面資源(CSS/JS)被瀏覽器攔截 | 混合內容:HTTPS 頁面引用 HTTP 資源 | 所有資源改相對路徑或 HTTPS 絕對路徑 |
| 客戶端認證失敗 | clientAuth="true" 但無信任庫 | 配置 truststoreFile/truststorePass 指向 CA 證書庫 |
web.xml `Strict-Transport-Security: max-age=31536000; includeSubDomains從 2017 年 Chrome 標記 HTTP 為「不安全」起,HTTPS 已成 Web 基礎設施。Tomcat 配置並不複雜,關鍵在於:理解證書鏈信任模型、正確配置加密套件、建立自動化續期機制。讓每一個部署的 Tomcat 都擁有綠色小鎖,是開發者的基本職業素養。