AWS EB应用负载均衡后端HTTPS重终止时SSL证书不生效问题排查
EDIT 2
经排查确认我的DNS记录配置错误,导致证书本身有效但站点仍被标记为不安全。
我需要执行以下操作:
- 为父域名而非子域名创建托管区域:无论子域名数量多少,都应为example.com创建托管区,而非subdomain.example.com
- 联系域名管理员在父域名注册商(如GoDaddy、Namecheap等)处为每个子域名添加NS记录,而非CNAME记录
- 为每个子域名配置别名记录,指向对应的EB环境
EDIT
我已为自定义域名申请了证书,但浏览器不信任该证书,因为当前站点是通过*.elasticbeanstalk.com域名对外提供服务的。我无法为非自有域名申请SSL证书,暂时没有解决思路。
原始问题描述
我有一个使用Auth0的应用运行在AWS Elastic Beanstalk(EB)中,前端部署应用负载均衡(ALB)。
Auth0要求运行在安全环境中,因此我在ALB处终止HTTPS连接后重新加密,将HTTPS流量转发到EC2实例后再次终止HTTPS连接。
我配置了可信SSL证书,选择邮件验证方式经全局管理员批准后,将证书绑定到ALB。当前Route53托管区域内未配置任何CNAME记录。
另外团队已将GoDaddy上的父域名通过NS记录指向AWS Route53托管区域,配置的别名记录可正常路由到应用,路由功能完全正常。
但访问站点时始终提示不安全,我已在多台设备测试排除缓存问题。
EC2实例上部署了自签名证书,我不确定对外暴露的是实例自签名证书还是ALB绑定的ACM证书,目前看大概率是实例证书被对外暴露。
我不清楚如何在实例侧使用ACM中的证书,根据AWS官方文档,后端使用自签名证书应该不会有问题。
相关配置截图
- ALB监听器配置:

- ACM中的证书ARN与上述配置匹配:

参考的官方文档
以下配置文件均参考官方文档配置:
- 为Elastic Beanstalk环境配置HTTPS
- 通过Elastic Beanstalk控制台配置安全监听器
- 在负载均衡型Elastic Beanstalk环境中配置端到端加密
- 在运行Node.js的EC2实例上终止HTTPS连接
- 配置应用在实例侧终止HTTPS连接
.ebextensions配置文件
我在应用根目录的.ebextensions文件夹下添加了如下.config文件:
https-instance-securitygroup.config
Resources: sslSecurityGroupIngress: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]} IpProtocol: tcp ToPort: 443 FromPort: 443 CidrIp: 0.0.0.0/0
.ebextensions/https-reencrypt-alb.config
option_settings: aws:elbv2:listener:443: DefaultProcess: https ListenerEnabled: 'true' Protocol: HTTPS aws:elasticbeanstalk:environment:process:https: Port: '443' Protocol: HTTPS
.ebextensions/https-instance.config
files: /etc/nginx/conf.d/https.conf: mode: "000644" owner: root group: root content: | # HTTPS server server { listen 443; server_name localhost; ssl on; ssl_certificate /etc/pki/tls/certs/server.crt; ssl_certificate_key /etc/pki/tls/certs/server.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; # For enhanced health reporting support, uncomment this block: #if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") { # set $year $1; # set $month $2; # set $day $3; # set $hour $4; #} #access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd; #access_log /var/log/nginx/access.log main; location / { proxy_pass http://nodejs; proxy_set_header Connection ""; proxy_http_version 1.1; 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 https; } } /etc/pki/tls/certs/server.crt: mode: "000400" owner: root group: root content: | -----BEGIN CERTIFICATE----- certificate file contents -----END CERTIFICATE-----
privatekey.config
Resources: AWSEBAutoScalingGroup: Metadata: AWS::CloudFormation::Authentication: S3Auth: type: "s3" buckets: ["application-keys"] roleName: "Fn::GetOptionSetting": Namespace: "aws:autoscaling:launchconfiguration" OptionName: "IamInstanceProfile" DefaultValue: "aws-ec2-eb-*****-role" files: # Private key (backend_app_server) "/etc/pki/tls/certs/server.key": mode: "000400" owner: root group: root authentication: "S3Auth" source: https://****.amazonaws.com/****.pem
内容的提问来源于stack exchange,提问作者BitShift
相关产品推荐
相关产品推荐

