You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关联AWS EC2实例的域名无法使用HTTPS,该如何解决?

排查EC2 HTTPS访问ERR_SSL_PROTOCOL_ERROR问题 & 替代ELB的方案

嘿,咱们先明确一个核心点:完全不需要强制使用带HTTPS监听器的Elastic Load Balancer(ELB),你当前的EC2+弹性IP+ACM证书架构下,有直接可行的解决办法。咱们一步步来排查问题:

可能的遗漏配置点 & 解决步骤

1. EC2实例上的Web服务器未配置HTTPS服务

安全组开了443端口只是AWS层面放行流量,但如果你的Nginx/Apache等Web服务器没监听443端口,也没配置SSL证书,那HTTPS请求过来自然会报协议错误。

  • 如果你用Nginx:
    要在配置文件里添加一个监听443的server块,示例如下:

    server {
        listen 443 ssl;
        server_name your-domain.com;
    
        ssl_certificate /path/to/your-acm-cert.pem;
        ssl_certificate_key /path/to/your-private-key.pem;
        ssl_trusted_certificate /path/to/your-acm-chain.pem;
    
        # 其他业务配置...
    }
    
  • 如果你用Apache:
    先启用mod_ssl模块,再修改httpd-ssl.conf配置文件,指定证书路径并监听443端口。

    注意:ACM的证书无法直接在控制台下载,你需要用AWS CLI在EC2实例上获取证书内容:

    aws acm get-certificate --certificate-arn <你的证书ARN> --output text
    

    把返回的证书、证书链分别保存到实例上的文件中;如果是DNS验证的证书,ACM会托管私钥,你可以通过aws acm export-certificate命令导出(需提前给IAM角色配置对应权限)。

2. EC2实例的操作系统防火墙未放行443端口

AWS安全组是外层防护,但实例本身的防火墙(比如firewalldiptables)可能拦截了443端口。

  • 对于Amazon Linux 2/RHEL系:
    sudo firewall-cmd --add-port=443/tcp --permanent
    sudo firewall-cmd --reload
    
  • 对于Ubuntu/Debian系:
    sudo ufw allow 443/tcp
    sudo ufw reload
    

3. Route53的CNAME记录配置错误

弹性IP是公网IP地址,而CNAME记录是用来指向另一个域名的,直接把域名的CNAME指向弹性IP不符合DNS规范,可能导致请求解析异常。

正确的做法是:创建A记录,将你的域名直接指向弹性IP地址。

4. SSL证书配置不完整或不匹配

即使你配置了HTTPS,如果证书链不完整、私钥和证书不匹配,也会导致SSL握手失败。

你可以在EC2实例上用openssl命令测试:

# 启动临时SSL服务器测试配置
openssl s_server -accept 443 -cert /path/to/cert.pem -key /path/to/private.key -CAfile /path/to/chain.pem

然后在本地终端执行:

openssl s_client -connect your-domain.com:443

查看返回的信息,根据证书不匹配、握手失败等提示调整配置。

关于ELB的选择

ELB确实能简化HTTPS配置(比如自动关联ACM证书,无需在EC2上手动配置SSL),还能提供负载均衡、自动扩缩容等能力,但它不是必须的。如果你只是单EC2实例的架构,直接在EC2上配置HTTPS完全可行,成本更低。

内容的提问来源于stack exchange,提问作者user3648673

火山引擎 最新活动