AWS SSL证书与弹性Beanstalk:HTTPS网站无法访问

6
当我将AWS证书与我的弹性Beanstalk应用程序关联,并使用https访问域时,我会收到“此网站无法访问,mydomain.com拒绝连接”的消息。 我可以使用http访问该站点。
我使用AWS的ACM创建了一个安全证书。 我将我的域名example.com以及其他子域名添加到证书中。 在我的应用程序环境的“负载平衡”部分中,我设置了以下内容:

enter image description here

我设置了名为awseb-e-abc123-stack-*的安全组,用于我的环境,如下所示: enter image description here 另外还有一个名为awseb-e-abc123-stack-AWSEBLoadBalancerSecurityGroup-*的安全组,它与上面的安全组具有相同的名称标签,与我的环境名称相同。

enter image description here

似乎,“AWSEBLoadBalancerSecurityGroup”安全组的条目没有作用,即使删除所有条目仍允许HTTP流量工作。

在“.elasticbeanstalk\securelistener.config”中,我有以下内容

option_settings:
  aws:elb:listener:443:
    SSLCertificateId: <my certificate's ARN>
    ListenerProtocol: HTTPS
    InstancePort: 80

我将会翻译以下内容:

看起来,如果我在这个文件中添加一个语法错误,部署仍然会成功。

以下是curl -vL https://<我的域名>的输出:

* Rebuilt URL to: https://<my domain>/
*   Trying <my elastic IP>...
* connect to <my elastic IP> port 443 failed: Connection refused
* Failed to connect to <my domain> port 443: Connection refused
* Closing connection 0
curl: (7) Failed to connect to <my domain> port 443: Connection refused

我使用了一个独立的域名注册商来设置我的域名,并将我的域名的DNS A记录IP地址设置为我的弹性IP。
[编辑]
我之前提到更改负载均衡器安全组规则没有任何作用。这是因为我的EC2实例的安全组指向实例的安全组,而不是负载均衡器的安全组。当我将EC2的安全组指向负载均衡器的安全组时,安全组的规则得以执行。我通过删除负载均衡器安全组中的所有规则并查看是否接受请求来验证这一点。然而,如果我将HTTP和HTTPS规则添加回负载均衡器安全组但从实例安全组中删除所有规则,则所有HTTP请求都会经过。这不是预期的行为,因为负载均衡器应该将流量转发到实例。似乎发生的是(1)实例和负载均衡器安全组与实例和负载均衡器根本没有关系,(2)没有流量到达负载均衡器。
我还有什么遗漏吗?
[编辑2]

我误读了gkrizek的评论。如果我使用负载均衡器的公共DNS,我可以使用HTTP或HTTPS连接。我能够使用telnet连接到两个版本。所以,我创建了一个sub.testdomain.com的CNAME记录集到负载均衡器,而不是创建一个将testdomain.com设置为我的弹性IP的A记录。现在我能够浏览http://sub.testdomain.comhttps://sub.testdoamin.com。两个问题:

  • 在CNAME记录中使用负载均衡器的公共DNS是否可以?我不能使用*.elasticbeanstalk.com URL,因为它可能会更改,所以我想知道这里是否适用相同的情况。
  • 如何保护https://testdomain.com(无子域名)?似乎使用这种方法,无法拥有https://testdomain.com,因为我不能创建具有域名的A记录。

你是否在负载均衡器上终止 https,并使用 http 继续请求?当你执行像 curl -vL --insecure $url 这样的 curl 请求时会发生什么? - Jordan Stewart
我不确定是否存在默认设置(如果有的话,可能是终止)。您可以通过确保发送到实例的流量未加密(即实例可以理解其接收到的内容),或者通过检查负载均衡器是否将信息作为“http”而不是“https”发送到实例来进行检查。 - Jordan Stewart
通常情况下,您可以检查实例上的应用程序是否能够理解流量,但它无法理解加密请求。 - Jordan Stewart
使用 curl -vL 命令应该将 URL 解析到特定的 AWS 负载均衡器。然后,负载均衡器应该将其转发给实例。您能否确认您正在使用的 URL 指向 AWS 负载均衡器,或将请求转发到 AWS 负载均衡器?在您的 curl 输出中,您提供的 URL 解析为“我的弹性 IP”。通常情况下,弹性 IP 地址与 EC2 实例相关联,并且看起来实例的 443 端口未打开。 - Jordan Stewart
1
您是否尝试在浏览器中加载负载均衡器的DNS名称?此外,您可以尝试telnet到端口443上的负载均衡器的DNS吗?这将至少消除您自定义域/证书的DNS问题。 - gkrizek
显示剩余2条评论
1个回答

6
问题是您必须使用您的域名创建一个CNAME记录,并在地址中使用负载均衡器DNS名称。如果您使用弹性IP,则请求将不会发送到负载均衡器。
回答我的最后一个问题:
  • AWS说这样做是可以的
  • 您无法直接执行此操作,因为AWS不允许您将弹性IP分配给负载均衡器。您可以做的是拥有一个URL记录,将testdomain.com重定向到https://www.testdomain.com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接