Tomcat 启用 HTTPS/SSL 详细教程
启用 HTTPS (Hypertext Transfer Protocol Secure) 与 SSL/TLS (Secure Sockets Layer/Transport Layer Security) 对于保护 Apache Tomcat Web 服务器上的通信至关重要,它通过加密数据并验证服务器身份来确保安全性。本教程将详细指导您完成这一过程。
前提条件
在开始之前,请确保您已安装并配置好以下软件:
- Java Development Kit (JDK):
keytool工具(用于证书管理)是 JDK 的一部分。请确保 JDK 已正确安装并配置环境变量。 - Apache Tomcat: 已安装并正常运行的 Apache Tomcat 实例。
步骤 1:创建密钥库 (Keystore)
密钥库是一个受密码保护的文件,用于存储加密密钥和证书。
选项 A:生成自签名证书(适用于开发/测试环境)
在开发或测试环境中,您可以使用 keytool 工具生成一个自签名证书。
-
进入 Tomcat
conf目录:
bash
cd $CATALINA_HOME/conf
(请将$CATALINA_HOME替换为您的 Tomcat 安装目录)。 -
生成密钥库和自签名证书:
bash
keytool -genkey -alias tomcat -keyalg RSA -keysize 2048 -keystore .keystore -validity 3650-genkey: 生成密钥对。-alias tomcat: 为密钥库中的条目指定别名。-keyalg RSA: 指定密钥对的算法(RSA 是常用算法)。-keysize 2048: 指定 RSA 密钥的大小。-keystore .keystore: 指定密钥库文件的名称。通常将其命名为.keystore并放置在conf目录下。-validity 3650: 设置证书的有效期(例如,10 年)。
您将被提示输入以下信息:
* 密钥库密码 (Keystore password): 请牢记此密码,稍后在 Tomcat 配置中会用到。
* 名字与姓氏 (Common Name – CN): 这应该是您的服务器的完全限定域名 (FQDN),例如www.example.com或localhost(用于本地测试)。
* 组织单位、组织、城市、省/州、国家代码: 提供适当的详细信息。
*的密钥密码: 按 Enter 键使用与密钥库相同的密码。
选项 B:获取并导入 CA 签名证书(适用于生产环境)
在生产环境中,您需要从受信任的证书颁发机构 (CA) 获取证书。
-
创建密钥库并生成证书签名请求 (CSR):
首先,创建密钥库和私钥(类似于选项 A,但此密钥库将用于生成 CSR)。
bash
keytool -genkey -alias tomcat -keyalg RSA -keysize 2048 -keystore your_domain.jks
请确保“名字与姓氏”(Common Name)与您的域名匹配(例如,www.yourdomain.com)。然后,从此密钥库生成 CSR:
bash
keytool -certreq -alias tomcat -file certreq.csr -keystore your_domain.jks
将certreq.csr文件提交给您选择的证书颁发机构。 -
导入证书到密钥库:
一旦 CA 提供了您的签名证书以及任何中间/根证书,请按正确的顺序导入它们:-
导入根 CA 证书:
bash
keytool -import -alias root -keystore your_domain.jks -trustcacerts -file root.crt
(将root.crt替换为您的根 CA 证书的实际文件名)。 -
导入任何中间 CA 证书(如果提供):
bash
keytool -import -alias intermediate -keystore your_domain.jks -trustcacerts -file intermediate.crt
(根据需要替换intermediate.crt和intermediate别名)。 -
导入您的域证书:
bash
keytool -import -alias tomcat -keystore your_domain.jks -file your_domain.crt
(将your_domain.crt替换为您的服务器证书的实际文件名)。
注意: 如果您从 CA 获得了 PKCS#12 文件(
.p12或.pfx),您可以通过在server.xml中指定keystoreType="PKCS12"来直接使用它。 -
步骤 2:配置 Tomcat 的 server.xml
接下来,您需要告知 Tomcat 使用哪个密钥库进行 HTTPS 连接。
-
打开
server.xml:
导航到$CATALINA_HOME/conf/server.xml并用文本编辑器打开它。 -
定位并配置 SSL 连接器:
找到被注释掉的 SSL 连接器条目,通常类似于:
xml
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"/>
-->
取消注释此块并进行修改以指向您的密钥库。一个典型的 JKS 密钥库配置如下:
xml
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="${catalina.base}/conf/.keystore" keystorePass="your_keystore_password"
clientAuth="false" sslProtocol="TLS" />
*port="8443": 这是 HTTPS 的默认端口。您可以更改它,但请确保端口未被占用。如果更改,请同时更新 HTTP 连接器中的redirectPort(参见步骤 3)。
*protocol="org.apache.coyote.http11.Http11NioProtocol": 指定连接器协议。Http11NioProtocol通常推荐用于更好的性能。
*SSLEnabled="true": 为此连接器启用 SSL/TLS。
*scheme="https": 指示此连接器处理 HTTPS 请求。
*secure="true": 将此连接器标记为安全。
*keystoreFile: 您的密钥库文件的绝对路径。如果您的密钥库位于conf目录下,使用${catalina.base}/conf/.keystore是一个好习惯。
*keystorePass: 您为密钥库设置的密码。
*clientAuth="false": 如果您需要客户端证书身份验证,则设置为true(对于公共网站不常见)。
*sslProtocol="TLS": 指定要使用的 SSL/TLS 协议。TLS 是 SSL 的继任者。
*keystoreType="JKS"或keystoreType="PKCS12": 如果您的密钥库类型不是默认的 JKS,请指定其类型。 -
保存
server.xml文件。
步骤 3:(可选但推荐) 将 HTTP 重定向到 HTTPS
为确保所有流量都使用 HTTPS,您可以配置 Tomcat 自动将 HTTP 请求重定向到 HTTPS。
-
配置 HTTP 连接器的
redirectPort:
在server.xml中,找到您的 HTTP 连接器(通常在 8080 端口):
xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
确保redirectPort属性指向您的 HTTPS 端口(例如,8443)。 -
在
web.xml中添加安全约束:
此步骤强制所有 Web 应用程序流量使用 HTTPS。打开
$CATALINA_HOME/conf/web.xml。滚动到底部,在</web-app>结束标签之前,添加以下内容:
xml
<security-constraint>
<web-resource-collection>
<web-resource-name>Entire Application</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
*<url-pattern>/*</url-pattern>: 将约束应用于所有已部署 Web 应用程序中的所有 URL。
*<transport-guarantee>CONFIDENTIAL</transport-guarantee>: 要求所有通信通过机密(HTTPS)连接发送。 -
保存
web.xml文件。
步骤 4:重启 Tomcat 并测试
-
重启 Tomcat:
停止然后启动您的 Tomcat 服务器以应用更改。
bash
$CATALINA_HOME/bin/shutdown.sh
$CATALINA_HOME/bin/startup.sh
(Windows 系统请使用.bat文件)。 -
测试 HTTPS 连接:
打开您的 Web 浏览器并访问https://localhost:8443/(或您的服务器域名和配置的 HTTPS 端口)。- 如果您使用的是自签名证书,浏览器可能会显示关于证书不受信任的警告。您可以通常通过接受风险或添加例外来继续。
- 如果您使用的是 CA 签名证书,您应该会看到一个安全的挂锁图标,表示连接受信任。
-
测试 HTTP 到 HTTPS 重定向(如果已配置):
尝试通过 HTTP 端口访问您的应用程序(例如,http://localhost:8080/)。它应该会自动重定向到https://localhost:8443/。
故障排除提示
- 证书警告: 如果使用自签名证书,浏览器警告是预期的。对于 CA 签名证书,请确保所有中间证书和根证书都已正确导入。
- 路径/密码不正确: 仔细检查
server.xml中的keystoreFile和keystorePass。 - 端口冲突: 确保 8443 端口(或您选择的 HTTPS 端口)未被其他应用程序占用。
- 防火墙: 确保您的防火墙允许 HTTPS 端口的流量通过。
- Tomcat 日志: 检查
$CATALINA_HOME/logs/catalina.out(或其他日志文件)以查找 Tomcat 启动期间的任何错误。
通过遵循这些步骤,您应该能够成功地在 Apache Tomcat 上启用 HTTPS/SSL,从而为您的 Web 应用程序提供安全的通信。