本文介紹在Tomcat伺服器上配置JKS(Java KeyStore)和PFX(也稱為PKCS12)格式SSL認證的方法,包括認證檔案的下載與上傳、配置認證參數及安裝後的驗證步驟。
適用範圍
開始配置前,確保滿足以下條件:
認證狀態:已擁有由權威機構簽發的 SSL 憑證。若認證即將到期或已到期,請先續約SSL認證。
網域名稱匹配:確保認證能夠匹配所有需保護的網域名稱。如需添加或修改網域名稱,可根據需求購買正式認證或追加和更換網域名稱。
精確網域名稱:僅對指定網域名稱生效。
example.com僅對example.com生效。www.example.com僅對www.example.com生效。
萬用字元網域名稱:僅對其一級子網域名稱生效。
*.example.com對www.example.com、a.example.com等一級子網域名稱生效。*.example.com對根網域名稱example.com和多級子網域名稱a.b.example.com不生效。
說明如需匹配多級子網域名稱,綁定網域名稱中需包含該網域名稱(如
a.b.example.com),或包含相應的萬用字元網域名稱(如*.b.example.com)。伺服器許可權:需要使用
root賬戶或一個具有sudo許可權的賬戶。網域名稱解析:網域名稱已配置解析記錄並解析至伺服器的公網 IP。
操作步驟
步驟一:準備認證檔案
進入SSL認證管理頁面,在目標認證操作列單擊更多進入認證詳情頁面,然後在下載頁簽中下載伺服器類型為Tomcat的認證。
解壓下載的認證壓縮包,解壓後包含一個認證檔案(.pfx或.jks)和認證密碼檔案(.txt)。
說明選擇認證格式時,應根據實際需求、資源和系統相容性來決定。
JKS是Java專用的密鑰庫格式,適合主要在Java環境下使用,如果您的工具和指令碼都支援JKS,建議選擇JKS。
PFX是一種通用格式,被Java及其他平台廣泛支援。如果需要跨不同技術棧或與非Java系統整合,建議選擇PFX格式。
將解壓後的認證檔案(.pfx或.jks)和密碼檔案(.txt)上傳至伺服器,並存放在一個安全的外部目錄(
/etc/ssl/cert目錄)。重要為確保密鑰安全,建議在上傳後設定嚴格的檔案許可權,只允許Tomcat運行使用者讀取。
您可以使用遠程登入工具的本地檔案上傳功能來上傳檔案。例如PuTTY、Xshell或WinSCP等工具。如果您使用的是阿里雲Elastic Compute Service,關於上傳檔案的具體操作,請參見上傳或下載檔案。
步驟二:配置系統與網路環境
確保安全性群組和防火牆允許外部流量訪問。
在伺服器終端執行以下命令,檢測443連接埠的開放情況:
RHEL/CentOS
command -v nc > /dev/null 2>&1 || sudo yum install -y nc # 請將以下的 <當前伺服器的公網 IP> 替換為當前伺服器的公網 IP sudo ss -tlnp | grep -q ':443 ' || sudo nc -l 443 & sleep 1; nc -w 3 -vz <當前伺服器的公網 IP> 443如果輸出
Ncat: Connected to <當前伺服器公網 IP>:443,則表明443連接埠已開放。否則需在安全性群組和防火牆中開放443連接埠。Debian/Ubuntu
command -v nc > /dev/null 2>&1 || sudo apt-get install -y netcat # 請將以下的 <當前伺服器的公網 IP> 替換為當前伺服器的公網 IP sudo ss -tlnp | grep -q ':443 ' || sudo nc -l -p 443 & sleep 1; nc -w 3 -vz <當前伺服器的公網 IP> 443若輸出
Connection to <當前伺服器公網 IP> port [tcp/https] succeeded!或[<當前伺服器公網 IP>] 443 (https) open,則表明443連接埠已開放。否則需在安全性群組和防火牆中開放443連接埠。在安全性群組配置開放443連接埠。
重要若您的伺服器部署在雲平台,請確保其安全性群組已開放 443 連接埠 (TCP),否則外部無法訪問服務。以下操作以阿里雲 ECS 為例,其他雲平台請參考其官方文檔。
進入Elastic Compute Service執行個體,單擊目標執行個體名稱進入執行個體詳情頁面,請參考添加安全性群組規則,在安全性群組中添加一條授權策略為允許、協議類型為 TCP、目的連接埠範圍為 HTTPS(443)、授權對象為任何位置(0.0.0.0/0)的規則。
在防火牆中開放443連接埠。
執行以下命令,識別系統當前的防火牆服務類型:
if command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then echo "firewalld" elif command -v ufw >/dev/null 2>&1 && sudo ufw status | grep -qw active; then echo "ufw" elif command -v nft >/dev/null 2>&1 && sudo nft list ruleset 2>/dev/null | grep -q 'table'; then echo "nftables" elif command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet iptables; then echo "iptables" elif command -v iptables >/dev/null 2>&1 && sudo iptables -L 2>/dev/null | grep -qE 'REJECT|DROP|ACCEPT'; then echo "iptables" else echo "none" fi若輸出為
none,則無需進一步操作。否則,請根據輸出的類型(firewalld、ufw、nftables、iptables),執行以下命令開放 443 連接埠:firewalld
sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reloadufw
sudo ufw allow 443/tcpnftables
sudo nft add table inet filter 2>/dev/null sudo nft add chain inet filter input '{ type filter hook input priority 0; }' 2>/dev/null sudo nft add rule inet filter input tcp dport 443 counter accept 2>/dev/nulliptables
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT為避免 iptables 規則在系統重啟後失效,請執行以下命令持久化 iptables 規則:
RHEL/CentOS
sudo yum install -y iptables-services sudo service iptables saveDebian/Ubuntu
sudo apt-get install -y iptables-persistent sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
步驟三:在Tomcat伺服器安裝認證
進入Tomcat安裝根目錄,執行以下命令,開啟server.xml檔案。
sudo vim ./conf/server.xml按照以下樣本以及注釋說明配置server.xml。
重要為避免啟動Tomcat時出現錯誤,請在複製代碼時刪除注釋。
Tomcat各版本在配置SSL認證時步驟相似,但因支援的Java版本及設定檔格式有異,所以具體配置稍有不同,下面將分別介紹Tomcat 7、Tomcat 8.5和Tomcat 9這三個版本的配置方法。
Tomcat 9
請參照以下配置流程,配置連接埠轉寄、認證檔案等。
配置項一:
<!-- 將Connector port修改為80,將redirectPort修改為SSL預設連接埠443,將HTTP請求轉寄到443連接埠。 --> <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" maxParameterCount="1000" />配置項二:
PFX格式Tomcat9配置樣本
<!-- 將Tomcat中預設的HTTPS連接埠修改為443。8443連接埠不可通過網域名稱直接存取、需要在網域名稱後加上連接埠號碼。 --> <!-- 443連接埠是HTTPS的預設連接埠,可通過網域名稱直接存取,無需在網域名稱後加連接埠號碼。 --> <!-- Connector port有兩種運行模式NIO和APR,請選擇NIO模式。--> <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" maxParameterCount="1000" > <SSLHostConfig> <!-- conf/domain_name.pfx請您替換為認證的實際路徑,認證密碼替換為認證密碼檔案pfx-password.txt中的內容 --> <Certificate certificateKeystoreFile="/etc/ssl/cert/domain_name.pfx" certificateKeystorePassword="認證密碼" type="RSA" /> </SSLHostConfig> </Connector>JKS格式Tomcat9配置樣本
<!-- 將Tomcat中預設的HTTPS連接埠修改為443。8443連接埠不可通過網域名稱直接存取、需要在網域名稱後加上連接埠號碼。 --> <!-- 443連接埠是HTTPS的預設連接埠,可通過網域名稱直接存取,無需在網域名稱後加連接埠號碼。 --> <!-- Connector port有兩種運行模式NIO和APR,請選擇NIO模式。--> <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" maxParameterCount="1000" > <SSLHostConfig> <!-- conf/domain_name.jks請您替換為認證的實際路徑,認證密碼替換為認證密碼檔案pfx-password.txt中的內容 --> <Certificate certificateKeystoreFile="/etc/ssl/cert/domain_name.jks" certificateKeystorePassword="認證密碼" type="RSA" /> </SSLHostConfig> </Connector>配置項三:
配置樣本(需去掉<!- - 和 - ->注釋符):
<!-- 將redirectPort修改為443,讓HTTPS請求轉寄到443連接埠。 --> <Connector protocol="AJP/1.3" address="::1" port="8009" redirectPort="443" maxParameterCount="1000" />
Tomcat 8.5
手動指定SSL的實現方式(指定使用JSSE實現方式)。
配置樣本(需去掉<!- - 和 - ->注釋符):
PFX格式Tomcat8.5配置樣本
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" maxParameterCount="1000"> <SSLHostConfig> <!-- conf/domain_name.pfx請您替換為認證的實際路徑,認證密碼替換為認證密碼檔案pfx-password.txt中的內容 --> <Certificate certificateKeystoreFile="/etc/ssl/cert/domain_name.pfx" certificateKeystorePassword="認證密碼" type="RSA"/> </SSLHostConfig> </Connector>JKS格式Tomcat8.5配置樣本
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" maxParameterCount="1000"> <SSLHostConfig> <!-- conf/domain_name.jks請您替換為認證的實際路徑,認證密碼替換為認證密碼檔案jks-password.txt中的內容 --> <Certificate certificateKeystoreFile="/etc/ssl/cert/domain_name.jks" certificateKeystorePassword="認證密碼" type="RSA"/> </SSLHostConfig> </Connector>Tomcat 7
Tomcat伺服器自動選擇SSL的實現方式。如果按照該方式無法完成後續配置,可能是因為您的環境不支援自動選定的SSL實現方式。
配置樣本:
PFX格式Tomcat7配置樣本
<!-- #port屬性根據實際情況修改(HTTPS預設連接埠為443)。如果使用其他連接埠號碼,則您需要使用https://domain_name:port的方式來訪問您的網站。 keystoreFile值需替換為認證的實際路徑。 keystorePass值需替換為認證密碼檔案pfx-password.txt中的內容。 如需瞭解其他配置項,請前往Tomcat官網查看。--> <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" secure="true" keystoreFile="/etc/ssl/cert/domain_name.pfx" keystoreType="PKCS12" keystorePass="認證密碼" clientAuth="false" SSLProtocol="TLSv1.1+TLSv1.2+TLSv1.3" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>JKS格式Tomcat7配置樣本
<!-- #port屬性根據實際情況修改(HTTPS預設連接埠為443)。如果使用其他連接埠號碼,則您需要使用https://domain_name:port的方式來訪問您的網站。 keystoreFile值需替換為認證的實際路徑。 keystorePass值需替換為認證密碼檔案jks-password.txt中的內容。 如需瞭解其他配置項,請前往Tomcat官網查看。--> <Connector port="443" protocol="HTTP/1.1" connectionTimeout="20000" redirectport="8443" maxParameterCount="1000" SSLEnabled="true" scheme="https" secure="true" keystoreFile="/etc/ssl/cert/domain_name.jks" keystoreType="JKS" keystorePass="認證密碼" clientAuth="false" SSLProtocol="TLSv1.1+TLSv1.2+TLSv1.3" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>可選:在/conf/web.xml檔案,配置HTTP請求自動跳轉HTTPS。
進入Tomcat安裝根目錄,執行以下命令,開啟web.xml檔案。
sudo vim ./conf/web.xml在web.xml檔案最底部添加以下配置項。
<security-constraint> <web-resource-collection> <web-resource-name>SSL</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
進入Tomcat的bin目錄,執行以下命令驗證設定檔的合法性。若輸出
Configuration file test successful表示驗證通過。否則需根據提示重新修改配置,直至測試通過。./configtest.sh進入Tomcat的bin目錄,執行以下命令,停止並重啟Tomcat。
停止命令
sudo ./shutdown.sh重啟命令
sudo ./startup.sh
步驟四:驗證部署結果
請通過 HTTPS 訪問您已綁定認證的網域名稱(如
https://example.com,example.com需替換為實際網域名稱)。若瀏覽器地址欄顯示安全鎖表徵圖,說明認證已成功部署。如訪問異常或未顯示安全鎖,請先清除瀏覽器緩衝或使用無痕(隱私)模式重試。

Chrome 瀏覽器自 117 版本起,地址欄中的
已被新的
替代,需單擊該表徵圖後查看安全鎖資訊。
如仍有問題,請參考常見問題進行排查。
應用於生產環境
在生產環境部署時,遵循以下最佳實務可提升安全性、穩定性和可維護性:
使用非管理員權限使用者運行:
為應用建立專用的、低許可權的系統使用者,切勿使用擁有管理員權限的賬戶運行應用。
說明建議使用網關層配置 SSL的方案,即將認證部署在Server Load Balancer或Nginx等反向 Proxy上,由其終結 HTTPS 流量,再將解密後的 HTTP 流量轉寄到後端應用。
憑證外部化管理:
切勿將密碼等敏感資訊寫入程式碼在代碼或設定檔中。使用環境變數、Vault 或雲端服務商提供的Key Management Service來注入憑證。
啟用 HTTP 到 HTTPS 強制跳轉:
確保所有通過 HTTP 訪問的流量都被自動重新導向到 HTTPS,防止中間人攻擊。
配置現代 TLS 協議:
在伺服器配置中禁用老舊且不安全的協議(如 SSLv3, TLSv1.0, TLSv1.1),僅啟用 TLSv1.2 和 TLSv1.3。
認證監控與自動續期:
建議在認證部署完成後,為網域名稱開啟網域名稱監控功能。阿里雲將自動檢測認證有效期間,並在認證到期前發送提醒,協助您及時續期,避免服務中斷。具體操作請參見購買並開啟公網網域名稱監控。
常見問題
安裝或更新認證後,認證未生效或 HTTPS 無法訪問
常見原因如下:
伺服器安全性群組或防火牆未開放 443 連接埠。請參見配置系統與網路環境。
認證的綁定網域名稱未包含當前訪問的網域名稱。請參見網域名稱匹配。
修改 Tomcat 設定檔後,未重啟Tomcat服務。具體操作可參見停止並重啟Tomcat服務。
認證檔案未正確替換,或 Tomcat 配置未正確指定憑證路徑。請檢查 Tomcat 設定檔和所用認證檔案是否為最新且有效。
網域名稱已接入 CDN、SLB 或 WAF 等雲產品,但未在相應產品中安裝認證。請參閱流量經過多個雲產品時認證的部署位置完成相關操作。
當前網域名稱的 DNS 解析指向多台伺服器,但認證僅在部分伺服器上安裝。需分別在每個伺服器中安裝認證。
如需進一步排查,請參考:根據瀏覽器錯誤提示解決認證部署問題 和 SSL認證部署故障自助排查指南。
如何更新(替換)Tomcat 中已安裝的 SSL 憑證
請先備份伺服器上原有的認證檔案(.pfx或.jks,以及.txt檔案),然後登入數位憑證管理服務控制台,下載新的認證檔案,並上傳到目標伺服器覆蓋原有檔案(確保路徑和檔案名稱一致)。最後,重啟Tomcat服務,使新認證生效。=
Tomcat啟動失敗,日誌中出現 "Keystore was tampered with, or password was incorrect" 錯誤
這是比較常見的問題,請參照在Tomcat伺服器安裝認證部分,並按以下步驟排查:
確認
server.xml中配置的認證密碼與密碼檔案中的內容完全一致,注意不要包含多餘的空格或分行符號。確認
certificateKeystoreFile(或keystoreFile)的檔案路徑正確。確認Tomcat運行使用者對認證檔案有讀取許可權。
瀏覽器訪問時提示 "串連已重設" 或 "Connection Refused"
通常是網路連接的問題,請參照配置系統與網路環境,並按以下步驟排查:
確認伺服器的安全性群組和系統防火牆都已允許存取HTTPS連接埠(443或配置的其他連接埠)。
確認Tomcat服務正在運行。可使用
ps -ef | grep tomcat命令檢查。確認
server.xml中配置的port與訪問的連接埠一致。