如何通过域名让EC2上的Tomcat应用支持HTTPS连接?
针对你的情况,有两种主流方案可以解决,具体选择取决于你的部署需求:
方案一:让Tomcat直接处理HTTPS(需要转换证书格式)
你购买的PositiveSSL证书通常会提供 .crt(证书文件)、.key(私钥文件)、.ca-bundle(根证书链)这类文件,Tomcat无法直接识别,需要转换成它支持的PKCS12或JKS格式,推荐用PKCS12(更通用):
转换证书为PKCS12格式
用openssl命令把证书和私钥打包成PKCS12文件(确保EC2上已安装openssl):openssl pkcs12 -export -in certificate.crt -inkey private.key -out keystore.p12 -name tomcat -CAfile ca-bundle.crt -caname root执行时会要求设置一个密码,务必记住这个密码,后续配置要用到。
修改Tomcat的server.xml配置
替换原来443端口的<Connector>配置,指定PKCS12密钥库的路径、类型和密码:<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" maxParameterCount="1000"> <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> <SSLHostConfig> <Certificate certificateKeystoreFile="path/to/keystore.p12" certificateKeystoreType="PKCS12" certificateKeystorePassword="你设置的密码" type="RSA" /> </SSLHostConfig> </Connector>注意把
path/to/keystore.p12替换成实际路径,比如放在Tomcat的conf目录下就写conf/keystore.p12。验证配置
重启Tomcat,用netstat -tulpn | grep 443确认443端口正常监听,然后测试HTTPS连接。
方案二:用反向代理处理HTTPS(推荐,更灵活)
让Nginx或CDN(比如你设置CNAME的服务商)来处理HTTPS加密,后端Tomcat继续用HTTP运行,这种方式更适合后续扩展(比如加负载均衡、静态资源缓存):
以Nginx为例:
安装Nginx并放置证书
把PositiveSSL的证书文件(certificate.crt、private.key、ca-bundle.crt)放到Nginx的证书目录,比如/etc/nginx/ssl/。配置Nginx反向代理
编辑Nginx的虚拟主机配置文件:# 把HTTP请求重定向到HTTPS server { listen 80; server_name your-domain.com; return 301 https://$server_name$request_uri; } # 处理HTTPS请求,转发到Tomcat的HTTP端口 server { listen 443 ssl; server_name your-domain.com; ssl_certificate /etc/nginx/ssl/certificate.crt; ssl_certificate_key /etc/nginx/ssl/private.key; ssl_trusted_certificate /etc/nginx/ssl/ca-bundle.crt; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://localhost:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }重启Nginx
完成配置后重启Nginx,确保Tomcat的80端口只监听本地(可选,更安全),然后测试HTTPS连接。
额外排查点
- 确认EC2安全组已开放443端口的入站规则(如果是方案一),或者开放80/443端口(方案二)。
- 如果用了CDN服务商(比如设置CNAME的平台),检查CDN的SSL模式是否设置为「完全」或「严格」,同时确保CDN能正常访问EC2的80端口。
- 核对证书的域名是否与你的访问域名完全匹配,避免出现域名不匹配的错误。
内容的提问来源于stack exchange,提问作者Nanor

