一、Tomcat 能不能自己做 HTTPS

原笔记给出的结论是:

  • Tomcat 可以支持 HTTPS
  • 可以直接在 Tomcat 中配置证书

但它也补充了一个实践建议:

  • 生产中很多时候也会把证书放在 Nginx 上
  • 让 Nginx 负责对外加密
  • Tomcat 在后端继续跑 HTTP

也就是说,Tomcat 做 HTTPS 是完全可行的,只是未必总是最常见的生产方案。

二、Tomcat HTTPS 的核心思路是什么

无论是阿里云的 pfx 证书,还是华为云的 jks 证书,核心操作其实都集中在:

  • 修改 server.xml
  • 增加一个 8443Connector

原笔记在这里强调的关键字段包括:

  • SSLEnabled="true"
  • scheme="https"
  • secure="true"
  • keystoreFile
  • keystorePass

只要这些项配置正确,Tomcat 就具备了处理 HTTPS 请求的能力。

三、阿里云 PFX 证书怎么配置

原笔记先准备了证书目录:

mkdir -p /app/tools/tomcat/cert
mv 11654958_www.harbor-local.cn_tomcat.zip tomcat.zip
unzip tomcat.zip -d /app/tools/tomcat/cert

然后读取证书密码文件:

cat /app/tools/tomcat/cert/pfx-password.txt

server.xml 中新增的关键配置如下:

<Connector port="8443" protocol="HTTP/1.1"
           SSLEnabled="true"
           scheme="https"
           secure="true"
           keystoreFile="/app/tools/tomcat/cert/www.harbor-local.cn.pfx"
           keystoreType="PKCS12"
           keystorePass="w2nt7odp"
           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" />

这里最关键的点是:

  • keystoreFile 指向 .pfx
  • keystoreType="PKCS12"

写完后重启:

systemctl restart tomcat
ss -lntp | grep 8443

如果能看到 8443 监听,就说明 HTTPS 连接器已经生效。

四、JKS 证书配置和 PFX 有什么区别

原笔记指出,华为云的 jks 方案与阿里云 pfx 最大的区别主要是:

  • 不需要 keystoreType="PKCS12"

示意写法如下:

<Connector port="8443" protocol="HTTP/1.1"
           SSLEnabled="true"
           scheme="https"
           secure="true"
           keystoreFile="/app/tools/tomcat/cert/www.harbor-local.cn.jks"
           keystorePass="w2nt7odp"
           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" />

所以可以把这两种证书的差异简单记成:

  • pfx:记得带 PKCS12
  • jks:一般去掉这类类型声明

五、为什么 8080 还要跳转到 8443

如果只配了 8443,用户仍然可能习惯访问:

  • http://域名:8080

这时如果希望统一引导到 HTTPS,就需要让 Tomcat 对普通访问做安全约束。
原笔记通过修改:

/app/tools/tomcat/conf/web.xml

来实现。

核心配置如下:

<login-config>
    <auth-method>CLIENT-CERT</auth-method>
    <realm-name>Client Cert Users-only Area</realm-name>
</login-config>

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

它表达的核心意思是:

  • 对资源访问要求使用受保护的传输通道
  • 也就是强制走 HTTPS

修改后再重启:

systemctl restart tomcat

六、访问测试时要注意什么

原笔记通过本地 hosts 先做了解析:

192.168.1.20 ssl.harbor-local.cn

然后浏览器访问:

https://ssl.harbor-local.cn:8443

这一步能验证:

  • 域名和证书是否匹配
  • 8443 连接器是否工作正常
  • 浏览器是否能完成 HTTPS 握手

七、小结

Tomcat 配置 HTTPS 的核心,不在于记住所有 XML,而是先把路径理顺:

  • 准备证书文件
  • server.xml 中新增 8443 连接器
  • 根据证书格式调整 keystore 配置
  • 需要时在 web.xml 中把 8080 引导到 HTTPS

原笔记这一部分已经把 Tomcat 自身做 HTTPS 的主线覆盖得比较完整了。