在本教程中,您将学习如何使用 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 生成器自动创建 CSR。
- 按照我们的分步教程如何在 Tomcat 上生成 CSR操作。
重要提示:请记好生成 CSR 时使用的密钥库文件和别名(alias)。之后您需要将签名后的证书导入回同一个别名,因为对应的私钥就存放在那里。
在证书颁发机构验证您的请求并发送 SSL 文件后,请继续进行以下安装步骤。
在 Tomcat 中安装 SSL 证书
Tomcat 的安装分为两个阶段:首先将证书链和已签名的证书导入到已包含您私钥的密钥库中,然后在server.xml中配置 HTTPS 连接器以使用该密钥库。
步骤 1:准备您的 SSL 证书文件
您的证书颁发机构会将文件发送到您提供的电子邮箱地址,通常以 ZIP 压缩包的形式。请解压该文件。根据 CA 不同,文件可能以以下两种格式之一到达:
- PKCS#7:一个单独的.p7b(或.cer)文件,已经将您的证书与根证书、中间证书打包在一起。
- PEM:多个独立文件,通常包括一个用于服务器证书的.crt文件,以及单独的root.crt和intermediate.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 版本)。较早的指南会直接在连接器上以keystoreFile和keystorePass属性设置密钥库信息。这种方式已被上文所示的SSLHostConfig和Certificate元素取代,在受支持的 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 检测工具进行即时扫描,即可发现如缺失中间证书或不受信任的证书链等问题。
常见问题
常见原因是将签名后的证书导入到了一个新的别名下,而不是已经持有您私钥的别名。这样一来,keytool 会将其存储为一个没有密钥的可信证书条目,导致 Tomcat 无法完成 TLS 握手。请将签名后的证书回复重新导入到现有的私钥别名(即 CSR 步骤中使用的别名)。运行keytool -list -v -keystore example.jks确认导入是否成功,检查该别名显示为PrivateKeyEntry且证书链长度大于 1。
应先导入证书链。按顺序将根证书和任何中间证书作为可信条目添加,然后最后将您的域名证书导入到私钥别名中。这样可以让 keytool 在将签名回复附加到您的密钥之前建立完整的信任路径。如果使用 PKCS#7(.p7b)文件,证书链已经打包在一起,因此只需一次导入即可完成全部操作。
HTTPS 连接器定义在server.xml中,位于 Tomcat 安装目录下的conf文件夹中(例如$CATALINA_HOME/conf/server.xml)。在当前的 Tomcat 版本中,密钥库是通过嵌套的SSLHostConfig和Certificate元素引用的,而不是直接写在连接器上。
可以。Tomcat 同时支持这两种格式。对于 .p12 或 .pfx 密钥库,将certificateKeystoreType设置为PKCS12;对于 .jks 密钥库,则设置为JKS,并让certificateKeystoreFile指向对应的文件。PKCS12 是标准的、可移植的密钥库格式,因此对于新建密钥库来说是一个不错的默认选择。
Tomcat 的示例配置为安全连接器使用8443端口。若要在浏览器默认使用的标准端口上提供 HTTPS 服务,请将连接器的port设置为443,并确保没有其他连接器或服务已经占用该端口。
依次运行自带脚本$CATALINA_HOME/bin/shutdown.sh和$CATALINA_HOME/bin/startup.sh,或通过您的服务管理器重启 Tomcat 服务(例如在 Linux 上使用systemctl restart tomcat,或在 Windows 上使用“服务”面板)。对 server.xml 所做的更改需要重启后才能生效。


