Tomcat 启用 HTTPS/SSL 详细教程 – wiki大全

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 工具生成一个自签名证书。

  1. 进入 Tomcat conf 目录:
    bash
    cd $CATALINA_HOME/conf

    (请将 $CATALINA_HOME 替换为您的 Tomcat 安装目录)。

  2. 生成密钥库和自签名证书:
    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.comlocalhost(用于本地测试)。
    * 组织单位、组织、城市、省/州、国家代码: 提供适当的详细信息。
    * 的密钥密码: 按 Enter 键使用与密钥库相同的密码。

选项 B:获取并导入 CA 签名证书(适用于生产环境)

在生产环境中,您需要从受信任的证书颁发机构 (CA) 获取证书。

  1. 创建密钥库并生成证书签名请求 (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 文件提交给您选择的证书颁发机构。

  2. 导入证书到密钥库:
    一旦 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.crtintermediate 别名)。

    • 导入您的域证书:
      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 连接。

  1. 打开 server.xml
    导航到 $CATALINA_HOME/conf/server.xml 并用文本编辑器打开它。

  2. 定位并配置 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,请指定其类型。

  3. 保存 server.xml 文件。

步骤 3:(可选但推荐) 将 HTTP 重定向到 HTTPS

为确保所有流量都使用 HTTPS,您可以配置 Tomcat 自动将 HTTP 请求重定向到 HTTPS。

  1. 配置 HTTP 连接器的 redirectPort
    server.xml 中,找到您的 HTTP 连接器(通常在 8080 端口):
    xml
    <Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

    确保 redirectPort 属性指向您的 HTTPS 端口(例如,8443)。

  2. 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)连接发送。

  3. 保存 web.xml 文件。

步骤 4:重启 Tomcat 并测试

  1. 重启 Tomcat:
    停止然后启动您的 Tomcat 服务器以应用更改。
    bash
    $CATALINA_HOME/bin/shutdown.sh
    $CATALINA_HOME/bin/startup.sh

    (Windows 系统请使用 .bat 文件)。

  2. 测试 HTTPS 连接:
    打开您的 Web 浏览器并访问 https://localhost:8443/(或您的服务器域名和配置的 HTTPS 端口)。

    • 如果您使用的是自签名证书,浏览器可能会显示关于证书不受信任的警告。您可以通常通过接受风险或添加例外来继续。
    • 如果您使用的是 CA 签名证书,您应该会看到一个安全的挂锁图标,表示连接受信任。
  3. 测试 HTTP 到 HTTPS 重定向(如果已配置):
    尝试通过 HTTP 端口访问您的应用程序(例如,http://localhost:8080/)。它应该会自动重定向到 https://localhost:8443/

故障排除提示

  • 证书警告: 如果使用自签名证书,浏览器警告是预期的。对于 CA 签名证书,请确保所有中间证书和根证书都已正确导入。
  • 路径/密码不正确: 仔细检查 server.xml 中的 keystoreFilekeystorePass
  • 端口冲突: 确保 8443 端口(或您选择的 HTTPS 端口)未被其他应用程序占用。
  • 防火墙: 确保您的防火墙允许 HTTPS 端口的流量通过。
  • Tomcat 日志: 检查 $CATALINA_HOME/logs/catalina.out(或其他日志文件)以查找 Tomcat 启动期间的任何错误。

通过遵循这些步骤,您应该能够成功地在 Apache Tomcat 上启用 HTTPS/SSL,从而为您的 Web 应用程序提供安全的通信。

滚动至顶部