在Tomcat服务器安装SSL证书(Linux)

本文介绍在Tomcat服务器上配置JKS(Java KeyStore)和PFX(也称为PKCS12)格式SSL证书的方法,包括证书文件的下载与上传、配置证书参数及安装后的验证步骤。

重要

本文以安装在Linux操作系统中的Tomcat 7、8.59为例介绍。不同版本的操作系统或Web服务器,部署操作可能有所差异,如有问题,请联系产品技术专家进行咨询,详情请参见专家一对一服务

前提条件

  • 已通过数字证书管理服务购买和申请证书(状态已签发)。如需购买和申请证书,请参见购买正式证书申请证书

  • 域名已正确解析至当前服务器,且已完成工信部 ICP 备案(适用于中国内地服务器)。

    如何查看域名解析记录以及 ICP 备案信息

    打开网络拨测工具,选择网络诊断分析,输入当前域名,确认以下信息:

    • DNS 服务商解析结果中 A 记录的 IP 为当前服务器的公网 IP。

    • 备案检查网站已备案。若显示“网站未备案,请咨询网站服务器提供商”,请完成备案后再安装证书。

  • 已获得本服务器的管理权限(即“root账号”或“有 sudo 权限”的账号)。

操作步骤

步骤一:下载SSL证书

  1. 登录数字证书管理服务控制台。在左侧导航栏选择证书管理 > SSL证书管理

  2. SSL证书管理页面,定位需部署的目标证书,并确认以下信息:

    1. 证书状态:确保其为已签发。若为即将过期已过期,则需续费SSL证书

    2. 绑定域名:确保其能够匹配所有需保护的域名,否则未匹配的域名访问 HTTPS 时将出现安全警告。如需添加或修改,请参见追加和更换域名

      确认证书是否匹配目标域名

      证书的绑定域名可包含多个精确域名和通配符域名。每类域名的匹配规则如下:

      • 精确域名:仅对指定域名生效。

        • example.com 仅对 example.com 生效。

        • www.example.com 仅对 www.example.com 生效。

      • 通配符域名:仅对其一级子域名生效。

        • *.example.com 对 www.example.coma.example.com 等一级子域名生效。

        • *.example.com 对根域名 example.com 和多级子域名 a.b.example.com 不生效。

      说明

      如需匹配多级子域名,绑定域名中需包含该域名(如 a.b.example.com),或包含相应的通配符域名(如 *.b.example.com)。

  3. 在目标证书操作列单击更多进入证书详情页面,然后在下载页签中下载服务器类型Tomcat的证书。

  4. 解压下载的证书压缩包,解压后包含一个证书文件(.pfx或.jks)和证书密码文件(.txt)。

    说明

    选择证书格式时,应根据实际需求、资源和系统兼容性来决定。

    • JKSJava专用的密钥库格式,适合主要在Java环境下使用,如果您的工具和脚本都支持JKS,建议选择JKS。

    • PFX是一种通用格式,被Java及其他平台广泛支持。如果需要跨不同技术栈或与非Java系统集成,建议选择PFX格式。

步骤二:在Tomcat服务器安装证书

  1. 登录 Linux 服务器。

    阿里云服务器

    以下操作以阿里云云服务器 ECS 为例进行说明,其他类型的服务器请参照对应产品文档进行操作。

    1. 登录ECS管理控制台,在页面左侧顶部,选择目标ECS实例所在地域。

    2. 在左侧导航栏中选择实例与镜像 > 实例,在实例页面找到目标ECS实例,点击操作列的远程连接

    3. 在弹出的对话框中,选择通过Workbench远程连接并单击立即登录

    4. 选择终端连接作为连接方式,输入相关认证信息,并根据页面提示完成登录,即可进入服务器终端。详细操作请参考使用Workbench登录ECS实例

      说明

      若系统弹出“安全组白名单开通提示”面板,请按照页面提示单击一键添加

    其他云厂商服务器

    请通过对应云厂商提供的远程连接功能登录服务器终端。

    非云厂商服务器(如物理服务器、IDC托管主机等)

    请在本地使用SSH工具登录服务器终端。

    • Windows:在命令提示符(cmd)或PowerShell中运行:ssh用户名@服务器IP。如不支持 ssh 命令,可使用第三方软件(如 PuTTYWinSCP等)进行连接。

    • macOS/Linux:在系统自带的终端(Terminal)中运行:ssh用户名@服务器IP

    后续部分命令因操作系统类型不同而略有差异。请根据实际的服务器操作系统,选择对应的命令操作。

    • RHEL/CentOS 系列:包括 Alibaba Cloud Linux、Red Hat Enterprise Linux、CentOS、AlmaLinux、Rocky Linux、Anolis OS 及其衍生版本。

    • Debian/Ubuntu 系列:包括 Debian、Ubuntu 及其衍生版本。

    如何确认操作系统所属系列

    在服务器终端执行 cat /etc/os-release,根据输出的 ID_LIKEID 判断:

    • 若 ID_LIKE 或 ID 包含 rhel 或 centos,操作系统属于 RHEL/CentOS 系列。

    • 若 ID_LIKE 或 ID 包含 debian 或 ubuntu,操作系统属于 Debian/Ubuntu 系列。

  2. 开放安全组和防火墙的 443 端口。

    1. 在服务器终端执行以下命令,检测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端口。

    2. 若端口未开放,可参照如下操作在安全组和防火墙中开放443端口。

      1. 在安全组中开放 443 端口

      重要

      若您的服务器部署在云平台,请确保其安全组已开放 443 端口 (TCP),否则外部无法访问服务。以下操作以阿里云 ECS 为例,其他云平台请参考其官方文档。

      1. 登录ECS管理控制台,在页面左侧顶部,选择目标 ECS 实例所在地域。在实例页面,找到目标 ECS 实例。

      2. 单击目标实例名称,进入实例详情页面,单击安全组 > 内网入方向全部规则,确保存在一条授权策略允许协议类型为 TCP、目的端口范围为 HTTPS(443)、授权对象任何位置(0.0.0.0/0)的规则。

      3. 如不存在上述规则,请按以下步骤添加。更多安全组配置请参见添加安全组规则

        1. 在 ECS 实例详情页面,单击安全组 > 安全组列表,选择目标安全组并进入其详情页。

        2. 在安全组详情页的安全组详情 > 入方向下,单击增加规则

        3. 新建安全组规则面板,将访问目的(本实例)设置为 HTTPS(443),其余参数保持默认值,单击确定即可。

      2. 在服务器本地防火墙中开放 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,则无需进一步操作。否则,请根据输出的类型(firewalldufwnftablesiptables),执行以下命令开放 443 端口:

      firewalld

      sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reload

      ufw

      sudo ufw allow 443/tcp

      nftables

      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/null

      iptables

      sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

      为避免 iptables 规则在系统重启后失效,请执行以下命令持久化 iptables 规则:

      RHEL/CentOS 系列
      sudo yum install -y iptables-services
      sudo service iptables save
      Debian/Ubuntu 系列
      sudo apt-get install -y iptables-persistent
      sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
  3. 将解压后的证书文件和密码文件上传到Tomcat服务器的conf目录。

    说明

    Tomcat安装目录与您的服务器环境有关,您可以使用sudo find / -iname "*tomcat*"命令,查询Tomcat的安装目录。

    您可以使用远程登录工具附带的本地文件上传功能,上传文件。例如PuTTY、XshellWinSCP等。如果您使用的是阿里云云服务器 ECS,上传文件具体操作,请参见使用远程桌面或Windows APPWindows实例传输文件上传文件到Linux云服务器

  4. 进入Tomcat安装根目录,执行以下命令,打开server.xml文件。

    sudo vim ./conf/server.xml 
  5. 按照以下示例以及注释说明配置server.xml。

    重要

    为避免启动Tomcat时出现错误,请在复制代码时删除注释。

    Tomcat各版本在配置SSL证书时步骤相似,但因支持的Java版本及配置文件格式有异,所以具体配置稍有不同,下面将分别介绍Tomcat 7、Tomcat 8.5Tomcat 9这三个版本的配置方法。

    Tomcat 9

    请参照以下配置流程,配置端口转发、证书文件等。

    • 配置项一:

      image..png

      配置示例:

      <!-- 将Connector port修改为80,将redirectPort修改为SSL默认端口443,将HTTP请求转发到443端口。 -->
      <Connector port="80" protocol="HTTP/1.1"
                 connectionTimeout="20000"
                 redirectPort="443"
                 maxParameterCount="1000"
                 />
    • 配置项二。

      image..png

      配置示例(需去掉<!- - 和 - ->注释符):

      PFX格式Tomcat9配置示例

      <!-- 将Tomcat中默认的HTTPS端口修改为443。8443端口不可通过域名直接访问、需要在域名后加上端口号。 -->
      <!-- 443端口是HTTPS的默认端口,可通过域名直接访问,无需在域名后加端口号。 -->
      <!-- Connector port有两种运行模式NIOAPR,请选择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="conf/domain_name.pfx" 
                                   certificateKeystorePassword="xxxxxx" 
                                   type="RSA" />
              </SSLHostConfig>
      </Connector>

      JKS格式Tomcat9配置示例

      <!-- 将Tomcat中默认的HTTPS端口修改为443。8443端口不可通过域名直接访问、需要在域名后加上端口号。 -->
      <!-- 443端口是HTTPS的默认端口,可通过域名直接访问,无需在域名后加端口号。 -->
      <!-- Connector port有两种运行模式NIOAPR,请选择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="conf/domain_name.jks" 
                                   certificateKeystorePassword="xxxxxx" 
                                   type="RSA" />
              </SSLHostConfig>
      </Connector>
    • 配置项三:

      image..png

      配置示例(需去掉<!- - 和 - ->注释符):

      <!-- 将redirectPort修改为443,让HTTPS请求转发到443端口。 -->
      <Connector protocol="AJP/1.3"
                     address="::1"
                     port="8009"
                     redirectPort="443" 
                     maxParameterCount="1000"
                     />

    Tomcat 8.5

    手动指定SSL的实现方式(指定使用JSSE实现方式)。

    • 配置项:

      image..png

    • 配置示例(需去掉<!- - 和 - ->注释符):

      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="conf/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="conf/domain_name.jks"
                           certificateKeystorePassword="证书密码"
                           type="RSA"/>
          </SSLHostConfig>
      </Connector>

    Tomcat 7

    Tomcat服务器自动选择SSL的实现方式。如果按照该方式无法完成后续配置,可能是因为您的环境不支持自动选定的SSL实现方式。

    • 配置项:

      image..png

    • 配置示例:

      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="conf/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="conf/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"/>    
  6. 可选:在/conf/web.xml文件,配置HTTP请求自动跳转HTTPS。

    1. 进入Tomcat安装根目录,执行以下命令,打开web.xml文件。

      sudo vim ./conf/web.xml 
    2. 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>
  7. 进入Tomcatbin目录,执行以下命令验证配置文件的合法性。若输出Configuration file test successful表示验证通过。否则需根据提示重新修改配置,直至测试通过。

    ./configtest.sh
  8. 进入Tomcatbin目录,执行以下命令,停止并重启Tomcat。

    • 停止命令

      sudo ./shutdown.sh
    • 重启命令

      sudo ./startup.sh

步骤三:验证SSL证书是否安装成功

  1. 请通过 HTTPS 访问您已绑定证书的域名(如 https://yourdomain.comyourdomain.com 需替换为实际域名)。

  2. 若浏览器地址栏显示安全锁图标,说明证书已成功部署。如访问异常或未显示安全锁,请先清除浏览器缓存或使用无痕(隐私)模式重试。

    image

    说明

    Chrome 浏览器自 117 版本起,地址栏中的image已被新的image替代,需单击该图标后查看安全锁信息。

    image

说明

如仍有问题,请参考常见问题进行排查。

后续步骤(可选)

开启域名监控

建议在证书部署完成后,为域名开启域名监控功能。系统将自动检测证书有效期,并在到期前发送提醒,帮助您及时续期,避免服务中断。具体操作请参见购买并开启公网域名监控

常见问题

安装或更新证书后,证书未生效或 HTTPS 无法访问

常见原因如下:

如何更新(替换)Tomcat 中已安装的 SSL 证书

请先备份服务器上原有的证书文件(.pfx或.jks,以及.txt文件),然后登录数字证书管理服务控制台,下载新的证书文件,并上传到目标服务器覆盖原有文件(确保路径和文件名一致)。最后,重启Tomcat服务,使新证书生效。=