bg-tutorials

如何在 Tomcat 中安装 SSL 证书

在本教程中,您将学习如何使用 Java 的 keytool 工具在 Apache Tomcat 上安装 SSL 证书,然后在server.xml中配置 HTTPS 连接器。如果您还没有生成 CSR,第一部分将向您展示具体方法。

我们还录制了一个视频,为您演示整个流程。您可以观看视频、阅读说明,或两者结合。您可以在下方观看视频。

为 Tomcat 生成 CSR 代码

CSR 代表证书签名请求(Certificate Signing Request),是一段包含您的域名和组织当前信息的文本块。每位购买商业 SSL 证书的用户都必须向证书颁发机构(即 SSL 提供商)提交 CSR,以通过验证并获得证书。如果 CSR 中的信息有误,CA 将不会为其签名。

在 Tomcat 上,CSR 是通过keytool从 Java 密钥库(keystore)中创建的,同一个密钥库中还保存着您在安装过程中会重复使用的私钥。您有两种选择:

重要提示:请记好生成 CSR 时使用的密钥库文件别名(alias)。之后您需要将签名后的证书导入回同一个别名,因为对应的私钥就存放在那里。

在证书颁发机构验证您的请求并发送 SSL 文件后,请继续进行以下安装步骤。

在 Tomcat 中安装 SSL 证书

Tomcat 的安装分为两个阶段:首先将证书链和已签名的证书导入到已包含您私钥的密钥库中,然后在server.xml中配置 HTTPS 连接器以使用该密钥库。

步骤 1:准备您的 SSL 证书文件

您的证书颁发机构会将文件发送到您提供的电子邮箱地址,通常以 ZIP 压缩包的形式。请解压该文件。根据 CA 不同,文件可能以以下两种格式之一到达:

  • PKCS#7:一个单独的.p7b(或.cer)文件,已经将您的证书与根证书、中间证书打包在一起。
  • PEM:多个独立文件,通常包括一个用于服务器证书的.crt文件,以及单独的root.crtintermediate.crt文件。

将解压后的文件上传到服务器,放入与您生成 CSR 时所用密钥库相同的目录中(下文中称为example.jks)。确认您的文件格式后,按照对应的说明操作。

步骤 2:将证书导入密钥库

PKCS#7 格式。由于 .p7b 文件已经包含完整的证书链,只需一条命令即可将所有内容一次性导入到您现有的私钥别名中:

keytool -import -trustcacerts -alias ssldragon -keystore example.jks -file example.p7b

ssldragon替换为您自己的别名,将example替换为您的文件名。该别名必须是已经持有您私钥的别名(即 CSR 步骤中使用的别名)。当您看到消息Certificate reply was installed in keystore时,说明导入成功。使用以下命令验证密钥库内容:

keytool -list -v -keystore example.jks

查找类型为PrivateKeyEntry且证书链长度大于 1 的条目。这可以确认已签名的证书现在已附加到您的私钥上。

PEM 格式。请按证书链顺序分别导入证书:先导入根证书,然后导入任何中间证书,最后导入您的域名证书。先导入证书链可以让 keytool 在将签名证书附加到您的密钥之前建立完整的信任路径。导入根证书:

keytool -import -trustcacerts -alias root -keystore example.jks -file root.crt

然后导入中间证书:

keytool -import -trustcacerts -alias intermediate -keystore example.jks -file intermediate.crt

如果您的 CA 提供了多个中间证书,请将每一个证书导入到各自单独的可信别名下,并按照它们相互签名的顺序(从根证书一直到您的域名证书)依次导入。例如,Sectigo 的Sectigo PositiveSSL证书附带多个中间证书,因此需要在导入域名证书之前依次导入这些中间证书。

最后,将您的主证书(即为您的域名颁发的证书)导入现有的私钥别名中,即您生成 CSR 时使用的同一个别名:

keytool -import -trustcacerts -alias ssldragon -keystore example.jks -file example.crt

此处的ssldragon必须是您现有的私钥别名。由于该别名已经拥有密钥,keytool 会将此次导入视为证书回复(certificate reply),并将已签名的证书绑定到该密钥上。这一步正是使 HTTPS 生效的关键。

重要注意事项:不要将签名后的证书导入到一个全新的别名下。如果该别名没有对应的私钥,keytool 会将证书作为一个独立的可信条目存储,而不附带任何密钥,这将导致 TLS 失败。如果您不确定哪个别名持有您的密钥,请运行keytool -list -v -keystore example.jks,并使用类型为PrivateKeyEntry的别名。

步骤 3:在 server.xml 中配置 HTTPS 连接器

证书已导入密钥库后,需要让 Tomcat 的 HTTPS 连接器指向该密钥库。该连接器定义在server.xml文件中,位于 Tomcat 安装目录下的conf文件夹中(例如$CATALINA_HOME/conf/server.xml)。请用文本编辑器打开该文件。

在当前的 Tomcat 版本(9、10 和 11)中,推荐的形式是嵌套一个SSLHostConfig元素,该元素内部包含一个引用您密钥库的Certificate元素。请添加或更新安全连接器,使其如下所示:

<Connector
    port="443"
    protocol="org.apache.coyote.http11.Http11NioProtocol"
    maxThreads="150"
    SSLEnabled="true"
    scheme="https"
    secure="true">
  <SSLHostConfig>
    <Certificate
        certificateKeystoreFile="/your_path/example.jks"
        certificateKeystorePassword="your_keystore_password"
        certificateKeystoreType="JKS"
        certificateKeyAlias="ssldragon"
        type="RSA" />
  </SSLHostConfig>
</Connector>
  • certificateKeystoreFile:您密钥库文件的完整路径。
  • certificateKeystorePassword:密钥库密码。
  • certificateKeystoreType:对于 .jks 密钥库使用JKS,对于 .p12 / .pfx 密钥库使用PKCS12
  • certificateKeyAlias:持有您私钥和已签名证书的别名(此处为ssldragon)。这告诉 Tomcat 在密钥库中存在多个条目时应使用哪一个。

注意:上文使用的端口443是标准的 HTTPS 端口;而 Tomcat 自带的示例默认使用8443,请根据您的环境需要选择合适的端口。如果这是您第一次设置 HTTPS,安全连接器可能在 server.xml 中被注释掉了。请移除周围的注释标记以启用该连接器,并确保没有其他连接器已经绑定到同一端口。

旧版形式(较早的 Tomcat 版本)。较早的指南会直接在连接器上以keystoreFilekeystorePass属性设置密钥库信息。这种方式已被上文所示的SSLHostConfigCertificate元素取代,在受支持的 Tomcat 版本中应使用后者。

步骤 4:保存 server.xml 并重启 Tomcat

保存 server.xml 文件后,重启 Tomcat 以重新加载配置。在 Linux 上,可使用自带的脚本:

$CATALINA_HOME/bin/shutdown.sh
$CATALINA_HOME/bin/startup.sh

如果 Tomcat 是以服务方式运行的,请通过您的服务管理器重启(例如在 Linux 上使用systemctl restart tomcat,或在 Windows 上使用“服务”面板)。恭喜,您的 SSL 证书现已成功安装在您的 Tomcat 服务器上。

测试您的 Tomcat SSL 安装

证书安装完成后,一些小错误可能悄然发生而不易察觉,却会影响浏览器对您网站的信任度。请养成检查安装情况的习惯。运行我们的SSL 检测工具进行即时扫描,即可发现如缺失中间证书或不受信任的证书链等问题。

常见问题

为什么我的 Tomcat SSL 证书导入后无法正常使用?

常见原因是将签名后的证书导入到了一个新的别名下,而不是已经持有您私钥的别名。这样一来,keytool 会将其存储为一个没有密钥的可信证书条目,导致 Tomcat 无法完成 TLS 握手。请将签名后的证书回复重新导入到现有的私钥别名(即 CSR 步骤中使用的别名)。运行keytool -list -v -keystore example.jks确认导入是否成功,检查该别名显示为PrivateKeyEntry且证书链长度大于 1。

应先导入证书链还是先导入域名证书?

应先导入证书链。按顺序将根证书和任何中间证书作为可信条目添加,然后最后将您的域名证书导入到私钥别名中。这样可以让 keytool 在将签名回复附加到您的密钥之前建立完整的信任路径。如果使用 PKCS#7(.p7b)文件,证书链已经打包在一起,因此只需一次导入即可完成全部操作。

Tomcat SSL 配置文件在哪里?

HTTPS 连接器定义在server.xml中,位于 Tomcat 安装目录下的conf文件夹中(例如$CATALINA_HOME/conf/server.xml)。在当前的 Tomcat 版本中,密钥库是通过嵌套的SSLHostConfigCertificate元素引用的,而不是直接写在连接器上。

我可以在 Tomcat 上使用 PKCS12 密钥库而不是 JKS 吗?

可以。Tomcat 同时支持这两种格式。对于 .p12 或 .pfx 密钥库,将certificateKeystoreType设置为PKCS12;对于 .jks 密钥库,则设置为JKS,并让certificateKeystoreFile指向对应的文件。PKCS12 是标准的、可移植的密钥库格式,因此对于新建密钥库来说是一个不错的默认选择。

Tomcat 使用哪个端口进行 HTTPS?

Tomcat 的示例配置为安全连接器使用8443端口。若要在浏览器默认使用的标准端口上提供 HTTPS 服务,请将连接器的port设置为443,并确保没有其他连接器或服务已经占用该端口。

更改 SSL 配置后如何重启 Tomcat?

依次运行自带脚本$CATALINA_HOME/bin/shutdown.sh$CATALINA_HOME/bin/startup.sh,或通过您的服务管理器重启 Tomcat 服务(例如在 Linux 上使用systemctl restart tomcat,或在 Windows 上使用“服务”面板)。对 server.xml 所做的更改需要重启后才能生效。

立即订购 SSL 证书, 可节省 10% 的费用!

快速发行, 强大加密, 99.99% 的浏览器信任度, 专业支持和 25 天退款保证. 优惠券代码 SAVE10

龙飞行的详细图像
撰写人

经验丰富的内容撰稿人, 擅长 SSL 证书. 将复杂的网络安全主题转化为清晰, 引人入胜的内容. 通过有影响力的叙述, 为提高数字安全作出贡献.