使用 Elastic Beanstalk 的 AWS SSL 证书:无法访问 HTTPS 站点
AWS SSL certificate with Elastic Beanstalk: HTTPS site not reachable
当我将 AWS 证书与我的 Elastic Beanstalk 应用程序相关联并使用 https 访问域时,我得到 'This site can’t be reached, mydomain.com refused to connect.' 我可以使用 http 访问该站点。
我使用 AWS 的 ACM 创建了一个安全证书。我添加了我的域名 example.com,以及作为证书子域的其他名称。在我的应用程序环境 'Loading balancing' 部分中,我进行了设置:
我为我的环境设置名为 awseb-e-abc123-stack-*
的安全组,如下所示:
还有一个名为awseb-e-abc123-stack-AWSEBLoadBalancerSecurityGroup-*
的安全组,如下。和上面组有同名标签,和我的环境名一样:
不过,似乎 "AWSEBLoadBalancerSecurityGroup" 安全组的条目没有任何作用,因为删除所有条目仍然允许 HTTP 流量工作。
在.elasticbeanstalk\securelistener.config
中,我有以下
option_settings:
aws:elb:listener:443:
SSLCertificateId: <my certificate's ARN>
ListenerProtocol: HTTPS
InstancePort: 80
不过,如果我在此文件中添加语法错误,部署仍然会成功。
这是 curl -vL https://<my domain>
的输出:
* 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 的评论。如果我使用负载均衡器的 public DNS,我可以使用 HTTP 或 HTTPS 进行连接。我可以使用 telnet 连接到两个版本。因此,我没有创建将 testdomain.com 设置为我的弹性 IP 的 A 记录,而是创建了一个 sub.testdomain.com CNAME 记录集到负载均衡器。现在我可以浏览 http://sub.testdomain.com
和 https://sub.testdoamin.com
。两个问题:
- 可以在 CNAME 记录中使用负载均衡器的 public DNS 吗?我不能使用 *.elasticbeanstalk.com URL 因为它可能会改变,所以我想知道同样的情况是否适用于这里
- 如何保护
https://testdomain.com
(无子域)。好像用这个方法,不可能有https://testdomain.com
,因为我不能用域名创建A记录。
问题是您必须使用您的域创建 CNAME 记录并将负载平衡器 DNS 名称用作地址。如果您使用弹性 IP,请求将不会转到负载均衡器。
回答我最后的问题:
- AWS says这个可以
- 您不能直接执行此操作,因为 AWS 不允许您将弹性 IP 分配给负载均衡器。你可以做的是有一个 URL 记录重定向 testdomain.com 到 https://www.testdomain.com
当我将 AWS 证书与我的 Elastic Beanstalk 应用程序相关联并使用 https 访问域时,我得到 'This site can’t be reached, mydomain.com refused to connect.' 我可以使用 http 访问该站点。
我使用 AWS 的 ACM 创建了一个安全证书。我添加了我的域名 example.com,以及作为证书子域的其他名称。在我的应用程序环境 'Loading balancing' 部分中,我进行了设置:
我为我的环境设置名为 awseb-e-abc123-stack-*
的安全组,如下所示:
还有一个名为awseb-e-abc123-stack-AWSEBLoadBalancerSecurityGroup-*
的安全组,如下。和上面组有同名标签,和我的环境名一样:
不过,似乎 "AWSEBLoadBalancerSecurityGroup" 安全组的条目没有任何作用,因为删除所有条目仍然允许 HTTP 流量工作。
在.elasticbeanstalk\securelistener.config
中,我有以下
option_settings:
aws:elb:listener:443:
SSLCertificateId: <my certificate's ARN>
ListenerProtocol: HTTPS
InstancePort: 80
不过,如果我在此文件中添加语法错误,部署仍然会成功。
这是 curl -vL https://<my domain>
的输出:
* 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 的评论。如果我使用负载均衡器的 public DNS,我可以使用 HTTP 或 HTTPS 进行连接。我可以使用 telnet 连接到两个版本。因此,我没有创建将 testdomain.com 设置为我的弹性 IP 的 A 记录,而是创建了一个 sub.testdomain.com CNAME 记录集到负载均衡器。现在我可以浏览 http://sub.testdomain.com
和 https://sub.testdoamin.com
。两个问题:
- 可以在 CNAME 记录中使用负载均衡器的 public DNS 吗?我不能使用 *.elasticbeanstalk.com URL 因为它可能会改变,所以我想知道同样的情况是否适用于这里
- 如何保护
https://testdomain.com
(无子域)。好像用这个方法,不可能有https://testdomain.com
,因为我不能用域名创建A记录。
问题是您必须使用您的域创建 CNAME 记录并将负载平衡器 DNS 名称用作地址。如果您使用弹性 IP,请求将不会转到负载均衡器。
回答我最后的问题:
- AWS says这个可以
- 您不能直接执行此操作,因为 AWS 不允许您将弹性 IP 分配给负载均衡器。你可以做的是有一个 URL 记录重定向 testdomain.com 到 https://www.testdomain.com