配置Route 53、ACM与GoDaddy后,AWS EC2上Spring Boot的HTTPS访问错误
核心问题
报错Error: connect ECONNREFUSED 13.49.000.000:443说明目标EC2实例的443端口无服务监听,或流量被拦截。结合你的配置,关键遗漏点是AWS ACM证书无法直接部署到EC2实例——ACM证书仅支持绑定到AWS托管服务(如ALB、CloudFront),不能直接下载到EC2使用;同时你的Spring Boot应用默认监听8080端口,未配置443端口的HTTPS服务。
排查验证步骤
检查EC2的443端口监听状态
登录EC2实例,执行命令确认是否有服务监听443端口:ss -tulpn | grep 443若无输出,说明无服务在443端口监听,这是根本原因。
验证EC2本地防火墙规则
检查iptables是否阻止了443端口:sudo iptables -L -n | grep 443若存在REJECT规则,需删除并放行443端口。
解决方案
方案一:使用Application Load Balancer(ALB)(AWS最佳实践)
通过ALB转发HTTPS流量到EC2的8080端口,同时绑定ACM证书:
- 创建ALB:选择互联网-facing类型,配置443端口监听并绑定已签发的ACM证书;添加80端口监听,配置转发到443实现强制HTTPS跳转。
- 配置目标组:将目标组流量转发到EC2实例的8080端口,确保健康检查路径(如
/actuator/health)返回200状态码。 - 更新Route 53:将A记录从EC2公网IP改为ALB的DNS名称。
- 调整EC2安全组:允许来自ALB安全组的8080端口入站流量(或直接放行ALB安全组的所有流量)。
方案二:EC2部署Nginx+Let's Encrypt证书
若不想使用ALB,可通过Nginx做反向代理,搭配Let's Encrypt免费证书实现HTTPS访问:
安装Nginx
Ubuntu/Debian:sudo apt update && sudo apt install nginx -yAmazon Linux/CentOS:
sudo yum install nginx -y获取SSL证书并配置反向代理
使用Certbot自动获取Let's Encrypt证书并配置Nginx:sudo apt install certbot python3-certbot-nginx -y # Ubuntu/Debian # 或 sudo yum install certbot python3-certbot-nginx -y # Amazon Linux/CentOS sudo certbot --nginx -d api.mydomain.com按交互提示完成配置,Certbot会自动生成Nginx规则,将443端口请求转发到Spring Boot的8080端口。
验证配置并重启Nginx
查看Nginx配置文件(通常在/etc/nginx/sites-available/api.mydomain.com),确认包含以下反向代理规则:server { listen 443 ssl; server_name api.mydomain.com; ssl_certificate /etc/letsencrypt/live/api.mydomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/api.mydomain.com/privkey.pem; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name api.mydomain.com; return 301 https://$host$request_uri; }重启Nginx生效:
sudo systemctl restart nginx验证端口监听
再次执行ss -tulpn | grep 443,确认Nginx正在监听443端口。
内容的提问来源于stack exchange,提问作者Muli

