如何在 Apache Tomcat 中实现 SSL?

在 Tomcat 服务器上配置 SSL/TLS 证书的详细指南

为 Tomcat 服务器配置 SSL 证书是保障 Web 应用安全的关键步骤,确保用户可以通过 HTTPS 安全访问应用。

实现 HTTPS 的方法有很多种,例如:

  • 在负载均衡器上终止 SSL 连接。
  • 在 CDN (内容分发网络) 层级实施 SSL。
  • 使用 Apache、Nginx 等 Web 服务器作为前端,并在这些服务器上配置 SSL。

但是,如果您的架构不包含上述任何方案,或者您需要直接在 Tomcat 中配置 SSL,那么本文将为您提供详细的指导。

本文将涵盖以下几个方面:

  • 生成 CSR (证书签名请求)。
  • 将证书导入到密钥库文件中。
  • 在 Tomcat 中启用 SSL。
  • 配置 TLS 协议。
  • 将 Tomcat 配置为监听 443 端口。
  • 测试 Tomcat 的 SSL 安全性。

让我们开始吧!

准备 SSL/TLS 证书

第一步是生成 CSR,然后将其提交给证书颁发机构进行签名。我们将使用 keytool 工具来管理证书。

  • 登录到 Tomcat 服务器。
  • 进入 Tomcat 安装目录。
  • 创建一个名为 ssl 的文件夹。
  • 执行命令创建密钥库。
keytool -genkey -alias domainname -keyalg RSA -keysize 2048 -keystore filename.jks

上述命令中有两个变量需要您根据实际情况进行更改:

  • alias:建议使用有意义的别名,方便日后识别。 我建议使用域名作为别名。
  • filename:同样,使用域名作为文件名是一个不错的选择。

例如:


  [user@example ssl]# keytool -genkey -alias bloggerflare -keyalg RSA -keysize 2048 -keystore bloggerflare.jks
  Enter keystore password:
  Re-enter new password:
  What is your first and last name?
  [Unknown]: bloggerflare.com
  What is the name of your organizational unit?
  [Unknown]: Blogging
  What is the name of your organization?
  [Unknown]: Geek Flare
  What is the name of your City or Locality?
  [Unknown]:
  What is the name of your State or Province?
  [Unknown]:
  What is the two-letter country code for this unit?
  [Unknown]:
  Is CN=bloggerflare.com, OU=Blogging, O=Geek Flare, L=Unknown, ST=Unknown, C=Unknown correct?
  [no]: yes

  Enter key password for <bloggerflare>
  (RETURN if same as keystore password):

  [user@example ssl]#

注意,“名字和姓氏”的问题实际上指的是您要保护的域名,而不是您的个人信息。

提供所有必要的信息后,该命令会在当前目录下生成一个密钥库文件。

接下来,使用以下命令,通过新创建的密钥库文件生成 CSR:

keytool -certreq -alias bloggerflare -keyalg RSA -file bloggerflare.csr -keystore bloggerflare.jks

您需要将生成的 CSR 发送给证书颁发机构进行签名。如果您是初学者,可以考虑使用免费的证书提供商,或者选择更高级的商业证书。

我已签署了证书,接下来使用以下命令将其导入密钥库:

  • 导入由证书提供商提供的根证书。
keytool -importcert -alias root -file root.cer -keystore bloggerflare.jks
  • 导入中间证书。
keytool -importcert -alias intermediate -file intermediate.cer -keystore bloggerflare.jks

注意:如果不导入根证书和中间证书,您将无法将域名证书导入密钥库。如果有多个中间证书,您需要将它们全部导入。

  • 导入域名证书。
keytool -importcert -file bloggerflare.cer -keystore bloggerflare.jks -alias bloggerflare

完成导入后,您将收到一条确认消息,表示证书已成功安装到密钥库中。

太棒了!现在密钥库已经准备就绪,接下来进行下一步。

如果您对 SSL 知识尚不熟悉,并希望深入了解,可以考虑报名参加这个在线课程 – SSL/TLS 操作

在 Tomcat 中启用 SSL

假设您仍然登录到 Tomcat 服务器,请转到 conf 文件夹。

  • 备份 server.xml 文件。
  • 找到 <Connector port="8080" protocol="HTTP/1.1"> 部分,并添加以下一行:
SSLEnabled="true" scheme="https" keystoreFile="ssl/bloggerflare.jks" keystorePass="chandan" clientAuth="false" sslProtocol="TLS"
  • 请务必将 keystoreFilekeystorePass 的值替换为您实际的文件名和密码。
  • 重新启动 Tomcat 服务器,现在您应该可以通过 HTTPS 访问 Tomcat 了。

成功!

设置标准 HTTPS 端口

为什么需要设置标准端口?

如果观察上面的截图,我正在通过 https:// + 8080端口 访问 Tomcat,这并非标准做法。还有其他一些原因:

  • 您不希望用户记住自定义端口号。
  • 浏览器可能会发出警告,因为证书是针对没有端口的域名颁发的。

因此,我们需要配置 Tomcat 监听 443 端口,以便可以通过 https:// 直接访问,而无需指定端口号。

为此,请使用您喜欢的编辑器编辑 server.xml 文件。

  • 找到 <Connector port="8080"
  • 将端口号从 8080 更改为 443。
  • 更改后应如下所示:
<Connector port="443" protocol="HTTP/1.1"
  connectionTimeout="20000"
  SSLEnabled="true" scheme="https" keystoreFile="ssl/bloggerflare.jks" keystorePass="chandan" clientAuth="false" sslProtocol="TLS"
  redirectPort="8443" />
  • 重新启动 Tomcat 并使用 https:// 访问您的应用,无需指定端口号。

太棒了,我们成功了!

SSL/TLS 安全性测试

最后,我们需要进行安全性测试,以确保我们的配置不会受到在线威胁。

我之前分享了很多在线测试工具,这里我将使用 SSL Labs。

  • 访问 SSL Labs 并输入您的 URL 开始测试。

它显示绿色,表示评级良好。

但是,我仍然建议您仔细查看报告,找出任何潜在的漏洞并修复它们。

这就是今天的全部内容。

希望本文能帮助您了解如何使用 SSL/TLS 证书来保护 Tomcat 服务器。如果您有兴趣进一步学习,我强烈推荐这个 课程