3.6 Tomcat SSL/TLS 配置 第三章:Tomcat 安装与配置 3.6 Tomcat SSL/TLS 配置 在当今互联网安全至上的时代,为 Web 应用启用安全连接已是至关重要的环节。SSL/TLS (Secure Sockets Layer/Transport Layer Security) 协议正是保障网络通信安全的核心技术。通过在 Tomcat 服务器上配置 SSL/TLS,我们可以实现 HTTPS (HTTP over SSL/TLS) 访问,从而加密客户端与服务器之间传输的数据,防止数据在传输过程中被窃听或篡改,保护用户的隐私和数据安全。
在当今互联网安全至上的时代,为 Web 应用启用安全连接已是至关重要的环节。SSL/TLS (Secure Sockets Layer/Transport Layer Security) 协议正是保障网络通信安全的核心技术。通过在 Tomcat 服务器上配置 SSL/TLS,我们可以实现 HTTPS (HTTP over SSL/TLS) 访问,从而加密客户端与服务器之间传输的数据,防止数据在传输过程中被窃听或篡改,保护用户的隐私和数据安全。
本章节将深入探讨如何在 Tomcat 中配置 SSL/TLS,包括证书的生成、Tomcat 配置文件的修改、以及配置过程中的关键参数详解。通过本章的学习,您将能够为您的 Tomcat Web 应用安全地启用 HTTPS 访问。
互联网的开放性在带来便利的同时,也带来了安全风险。HTTP 协议作为明文传输协议,其传输的数据内容容易被中间人截获,用户的敏感信息,如账号密码、交易数据等,都可能面临泄露的风险。
SSL/TLS 协议通过加密技术,在客户端和服务器之间建立起一条安全的加密通道。所有通过 HTTPS 传输的数据都会被加密,即使数据被截获,也无法被轻易解密,从而有效保障了数据传输的机密性和完整性。
为 Tomcat 配置 SSL/TLS 的主要优势包括:
数据加密: 保护用户数据在传输过程中的安全,防止敏感信息泄露。
身份认证: 通过数字证书验证服务器的身份,防止用户被重定向到钓鱼网站。
数据完整性: 防止数据在传输过程中被篡改,确保数据的可靠性。
提升用户信任度: 浏览器地址栏的“小绿锁”或安全标识,能够提升用户对网站的信任感。
符合安全合规性: 许多行业和地区都有数据安全合规性要求,HTTPS 是满足这些要求的必要措施。
上图直观地展示了 HTTPS 连接与 HTTP 连接的区别。HTTPS 通过 SSL/TLS 加密通道,保障了数据传输的安全性。
在开始配置 Tomcat 的 SSL/TLS 之前,需要确保您已满足以下前提条件:
安装 JDK (Java Development Kit): JDK 包含了 keytool 工具,我们将使用它来生成密钥库和证书。请确保您的系统已正确安装并配置了 JDK 环境。
安装 Tomcat 服务器: 您需要已安装并成功运行 Tomcat 服务器。本章内容基于已安装的 Tomcat 环境进行配置。
域名或 IP 地址: 如果您希望使用正式的 SSL/TLS 证书 (由权威 CA 机构颁发),您需要拥有一个域名。如果您只是进行本地测试或开发,可以使用 IP 地址或 localhost。
对 SSL/TLS 协议的基本理解: 了解 SSL/TLS 的基本概念,例如数字证书、密钥库、公钥、私钥等,将有助于您更好地理解配置过程。
在 Tomcat 中配置 SSL/TLS,首先需要创建一个密钥库 (Keystore),用于存储服务器的私钥和证书。Java 提供了 keytool 工具来生成和管理密钥库。
步骤 1:打开命令行终端
打开您的命令行终端 (例如 Windows 的命令提示符或 PowerShell,Linux/macOS 的终端)。
步骤 2:使用 keytool 生成密钥库
在命令行终端中,执行以下 keytool 命令来生成密钥库:
keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -validity 3650 -keystore tomcat.jks -storepass changeit
让我们详细解释一下这个命令的各个参数:
keytool: Java 提供的密钥和证书管理工具。
-genkeypair: 指定 keytool 执行的操作是生成密钥对 (包含公钥和私钥)。
-alias tomcat: 指定密钥对的别名 (Alias) 为 tomcat。别名用于在密钥库中唯一标识该密钥对。您可以根据需要自定义别名。
-keyalg RSA: 指定密钥算法为 RSA (Rivest-Shamir-Adleman)。RSA 是一种广泛使用的非对称加密算法,适用于密钥交换和数字签名。
-keysize 2048: 指定密钥长度为 2048 位。密钥长度越长,安全性越高,但同时也会增加计算复杂度。2048 位是目前推荐的 RSA 密钥长度。
-validity 3650: 指定证书的有效期为 3650 天 (10 年)。对于测试环境,可以设置较长的有效期。在生产环境中,建议根据安全策略设置合理的有效期,并定期更新证书。
-keystore tomcat.jks: 指定密钥库文件的名称为 tomcat.jks。密钥库文件将保存在您执行命令的当前目录下。您可以自定义密钥库文件的名称和路径。
-storepass changeit: 指定密钥库的访问密码为 changeit。请务必修改此默认密码,并使用强密码来保护您的密钥库安全。 在生产环境中,强烈建议使用更复杂、更安全的密码。
执行命令后,keytool 会提示您输入一些关于证书持有者的信息,例如:
What is your first and last name? [Unknown]: yourdomain.com // 输入您的域名或服务器 IP 地址,例如:localhost 或 127.0.0.1 What is the name of your organizational unit? [Unknown]: Your Organization Unit // 您的组织单位名称,例如:技术部门 What is the name of your organization? [Unknown]: Your Organization Name // 您的组织名称,例如:XX 公司 What is the name of your City or Locality? [Unknown]: Your City // 您的城市,例如:Beijing What is the name of your State or Province? [Unknown]: Your Province // 您的省份,例如:Beijing What is the two-letter country code for this unit? [Unknown]: CN // 您的国家代码,例如:CN (中国) Is CN=yourdomain.com, OU=Your Organization Unit, O=Your Organization Name, L=Your City, ST=Your Province, C=CN correct? [no]: yes // 确认信息是否正确,输入 yes 并回车
请根据实际情况填写这些信息。尤其重要的是 "What is your first and last name?" 这一项,对于通过域名访问的网站,必须填写您的域名;对于 IP 地址访问,可以填写服务器 IP 地址或 localhost。 这项信息会作为证书的 Common Name (CN),浏览器会根据 CN 来验证证书是否与访问的域名或 IP 地址匹配。
信息填写完成后,keytool 将生成 tomcat.jks 密钥库文件。您可以在当前目录下找到该文件。
上图描述了使用 keytool 生成密钥库的流程。
注意:
我们这里生成的是自签名证书 (Self-Signed Certificate)。自签名证书由服务器自己签发,而不是由权威的 CA 机构签发。在生产环境中,为了获得更高的信任度和避免浏览器警告,建议使用由权威 CA 机构颁发的证书。
对于生产环境,密钥库文件和密码的安全至关重要。请妥善保管密钥库文件,并使用强密码保护密钥库。不要将密钥库文件泄露给他人。
server.xml 文件生成密钥库后,我们需要修改 Tomcat 的 server.xml 配置文件,以启用 SSL/TLS 连接。
步骤 1:定位 server.xml 文件
server.xml 文件通常位于 Tomcat 安装目录下的 conf 文件夹中。例如,如果 Tomcat 安装在 /usr/local/tomcat 目录下,则 server.xml 文件的路径为 /usr/local/tomcat/conf/server.xml。
步骤 2:编辑 server.xml 文件
使用文本编辑器 (例如 Notepad++, Sublime Text, VS Code 等) 打开 server.xml 文件。
步骤 3:配置 <Connector> 元素
在 server.xml 文件中,找到 <Service name="Catalina"> 元素,然后在其中找到或添加一个 <Connector> 元素,用于配置 HTTPS 连接。
通常,Tomcat 默认配置中会包含一个 HTTP 连接器 (端口 8080) 和一个 AJP 连接器 (端口 8009)。您需要添加一个新的 <Connector> 元素来配置 HTTPS 连接,或者修改现有的 HTTP 连接器。
以下是一个配置 HTTPS 连接的 <Connector> 元素的示例:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="200" scheme="https" secure="true" SSLEnabled="true" keystoreFile="conf/tomcat.jks" keystorePass="changeit" keystoreType="JKS" keyAlias="tomcat" clientAuth="false" sslProtocol="TLSv1.2" ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>
让我们详细解释一下这个 <Connector> 元素中的各个属性:
port="8443": 指定 HTTPS 连接器监听的端口号为 8443。HTTPS 默认端口号为 443,但为了避免端口冲突或方便管理,通常会使用 8443 端口。您可以根据需要自定义端口号。
protocol="org.apache.coyote.http11.Http11NioProtocol": 指定连接器使用的协议处理类。Http11NioProtocol 是 Tomcat 推荐的非阻塞 I/O 模型协议处理类,性能较好。您也可以使用其他的协议处理类,例如 Http11AprProtocol (需要安装 APR 和 Native 库) 或 Http11BioProtocol (阻塞 I/O 模型,性能相对较差)。
maxThreads="200": 指定连接器处理请求的最大线程数。根据服务器性能和并发请求量,可以调整此参数。
scheme="https": 指定连接器的协议方案为 HTTPS。
secure="true": 指定连接器是安全的。
SSLEnabled="true": 启用 SSL/TLS 功能。
keystoreFile="conf/tomcat.jks": 指定密钥库文件的路径。这里使用的是相对路径 conf/tomcat.jks,表示密钥库文件位于 Tomcat 安装目录的 conf 文件夹下。您可以根据实际情况修改路径,也可以使用绝对路径。
keystorePass="changeit": 指定密钥库的访问密码。请务必将 changeit 替换为您在生成密钥库时设置的实际密码。
keystoreType="JKS": 指定密钥库的类型为 JKS (Java KeyStore)。这是 Java 默认的密钥库类型。
keyAlias="tomcat": 指定密钥库中使用的密钥对的别名。这里使用的是我们在生成密钥库时设置的别名 tomcat。
clientAuth="false": 指定是否启用客户端证书认证。false 表示不启用客户端证书认证,即服务器只验证自身证书,不要求客户端提供证书。true 或 want 表示启用客户端证书认证,服务器会要求或请求客户端提供证书进行验证。客户端证书认证通常用于对安全性要求极高的应用场景。
sslProtocol="TLSv1.2": 指定 SSL/TLS 协议版本。TLSv1.2 是目前推荐的安全协议版本。您可以根据需要选择其他协议版本,例如 TLSv1.3 (如果您的 JDK 和 Tomcat 版本支持)。
ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256": 指定服务器支持的密码套件 (Cipher Suites)。密码套件定义了 SSL/TLS 连接中使用的加密算法、密钥交换算法、消息认证码算法等。您可以根据安全需求和兼容性需求配置合适的密码套件列表。上述示例列出了一些常用的安全密码套件。
请根据您的实际情况修改上述配置,特别是 keystoreFile 和 keystorePass 属性,以及端口号、协议版本和密码套件等。
步骤 4:保存 server.xml 文件并重启 Tomcat
修改完成后,保存 server.xml 文件。然后,重启 Tomcat 服务器,使配置生效。
上图描述了配置 Tomcat server.xml 文件以启用 HTTPS 的流程。
配置完成后,我们需要测试 SSL/TLS 配置是否成功。
步骤 1:启动 Tomcat 服务器
确保 Tomcat 服务器已成功启动。
步骤 2:使用浏览器访问 HTTPS 地址
打开您的 Web 浏览器,输入 HTTPS 地址访问您的 Tomcat Web 应用。例如,如果您的域名是 yourdomain.com,并且您配置的 HTTPS 端口是 8443,则访问地址为 https://yourdomain.com:8443/。如果您使用 IP 地址或 localhost 进行测试,则访问地址为 https://localhost:8443/ 或 https://127.0.0.1:8443/。
步骤 3:检查浏览器安全提示
自签名证书: 如果您使用的是自签名证书,浏览器可能会显示安全警告,提示证书不是由受信任的 CA 机构颁发。这是正常现象,因为自签名证书默认不被浏览器信任。您可以选择“继续访问”或“信任此证书”来继续访问网站。在生产环境中,请务必使用由权威 CA 机构颁发的证书,以避免浏览器警告并提升用户信任度。
权威 CA 机构证书: 如果您使用的是由权威 CA 机构颁发的证书,浏览器地址栏应该会显示“小绿锁”或安全标识,表示连接是安全的,证书有效且受信任。
步骤 4:检查 SSL/TLS 连接信息
您可以点击浏览器地址栏的“小绿锁”或安全标识,查看 SSL/TLS 连接的详细信息,例如证书颁发者、有效期、使用的协议版本、密码套件等。这可以帮助您确认 SSL/TLS 配置是否生效,以及使用的协议和密码套件是否符合预期。
步骤 5:使用 openssl s_client 命令 (可选)
对于更专业的测试,您可以使用 openssl s_client 命令行工具来检查 SSL/TLS 连接。
在命令行终端中,执行以下命令:
openssl s_client -connect yourdomain.com:8443 -tls1_2
将 yourdomain.com:8443 替换为您的实际域名和端口号。-tls1_2 参数指定使用 TLSv1.2 协议进行连接。
openssl s_client 命令会输出详细的 SSL/TLS 连接信息,包括证书链、协议版本、密码套件等。您可以根据输出信息来验证 SSL/TLS 配置是否正确。
在配置 Tomcat SSL/TLS 的过程中,可能会遇到一些常见问题。以下是一些常见问题及其解决方法:
端口冲突: 如果您配置的 HTTPS 端口 (例如 8443) 已被其他程序占用,Tomcat 启动时可能会报错,并无法启动 HTTPS 连接器。请检查端口是否被占用,并修改 Tomcat 的 HTTPS 端口配置,或者停止占用端口的程序。
密钥库文件路径错误: 如果 server.xml 文件中配置的 keystoreFile 路径不正确,Tomcat 启动时可能会报错,并无法加载密钥库文件。请检查 keystoreFile 路径是否正确,确保密钥库文件存在于指定的路径。
密钥库密码错误: 如果 server.xml 文件中配置的 keystorePass 密码不正确,Tomcat 启动时可能会报错,并无法加载密钥库。请检查 keystorePass 密码是否与您在生成密钥库时设置的密码一致。
证书 CN (Common Name) 与访问域名不匹配: 如果您使用的证书的 CN (Common Name) 与您访问的域名或 IP 地址不匹配,浏览器会显示证书错误警告。请确保证书的 CN 与您访问的域名或 IP 地址一致。如果您使用自签名证书,并且 CN 设置为 localhost,则只能使用 https://localhost:8443/ 访问,使用 IP 地址或域名访问会提示证书错误。
SSL/TLS 协议版本或密码套件不兼容: 如果客户端 (例如浏览器) 与服务器端配置的 SSL/TLS 协议版本或密码套件不兼容,可能会导致 SSL/TLS 握手失败,连接无法建立。请检查客户端和服务器端支持的协议版本和密码套件,并进行相应的调整。建议使用安全的协议版本 (例如 TLSv1.2 或 TLSv1.3) 和密码套件。
防火墙或安全组规则: 如果您的服务器上启用了防火墙或安全组,请确保防火墙或安全组规则允许 HTTPS 端口 (例如 8443) 的入站连接。
Tomcat 日志: 如果您遇到 SSL/TLS 配置问题,可以查看 Tomcat 的日志文件,例如 catalina.out、localhost.<date>.log 等。日志文件中可能会包含详细的错误信息,帮助您定位问题。
如果您仍然无法解决问题,请仔细检查您的 Tomcat 配置,并参考 Tomcat 官方文档或在线社区寻求帮助。
本章节详细介绍了在 Tomcat 中配置 SSL/TLS 的步骤,包括生成密钥库、修改 server.xml 配置文件、测试 SSL/TLS 配置以及常见问题排查。通过本章的学习,您应该已经掌握了为 Tomcat Web 应用启用 HTTPS 访问的基本方法。
配置 SSL/TLS 是保障 Web 应用安全的重要措施。在生产环境中,请务必使用由权威 CA 机构颁发的证书,并定期更新证书。同时,建议根据安全策略配置合适的 SSL/TLS 协议版本和密码套件,以获得最佳的安全性和兼容性。
希望本章节内容能够帮助您成功配置 Tomcat SSL/TLS,为您的 Web 应用构建安全可靠的 HTTPS 连接。