带有负载均衡器的 aws ssl - ec2 实例 https 请求似乎没有被 ELB 终止

aws ssl with load balancer - ec2 instance https requests seems not terminated by ELB

我在 aws 中托管一个域,并希望允许对其发出 https 请求。我已经完成了以下步骤。

  1. 向 ACM 申请了证书,验证了电子邮件并颁发了证书。
  2. 创建了一个带有 http 和 https 侦听器的经典负载均衡器 (LB),通过 http(80) 转发到实例。
  3. 将证书附加到 LB 并添加运行网站的实例。
  4. 确保附加到实例和 LB 的安全组在入站规则中具有 http(80) 和 https(443)。
  5. LB 和实例安全组唯一的出站规则是(所有流量 - 全部 - 全部 - 0.0.0.0/0)。

然后我等待实例 "inService" 并通过浏览到它的 DNS 来测试 LB,它打开了。也打开了 http://mydomain.com,但是当我尝试 https://mydomain.com 时,我收到一条消息,提示浏览器 无法访问服务器。
经过一番搜索后,我添加了以下 2 条记录。

  1. 名称为 "mydomain.com" 且值为 "LB domain.com" 的记录。
  2. 具有名称 "www" 和值 "mydomain.com" 的 CNAME 记录。

我又试了一次,结果和上面一样。 最后我得出一个答案,我应该在我的实例服务器中启用 https。

当我这样做并浏览时,我得到了一个“安全连接失败”,错误代码为“SSL_ERROR_RX_RECORD_TOO_LONG”。

LB 似乎没有终止对我的域的 https 请求。
知道我做错了什么!

更新: 我删除了我创建的 A 记录,但是当我进行 DNS 查找时,我发现了一条指向我的弹性 ip 的 A 记录。虽然我有 CNAME 记录,但 DNS 查找显示我没有 CNAME 记录。

InService 只会在您在 /var/www/html/ 中创建内容时出现。所以我建议你在那边创建一个index.html文件,等1分钟就可以看到InService了。之后,你必须指出 CNAME 到 elb "address",它在 Router 53 中必须是小写的。但通常,它不会变得可见,所以只需等待并保持刷新,直到 elb 地址出现在 Router 53 中。我希望它会起作用。

好吧,这是一个愚蠢的错误。在我之前工作的人在godaddy上注册了域名,然后在godaddy上使用A记录指向实例。所以我在route53中添加的记录是没有意义的。所以我在 godaddy 中创建了一个 CNAME 记录,它解析为 ELB DNS,现在一切正常。

对于那些可能遇到类似问题的人,我会尝试写一些建议。
首先,当您选择添加负载平衡器时,客户端不应直接访问您的实例。您应该将用户重定向到 ELB,ELB 将完成剩下的工作。 如果您从其他地方而不是 AWS 获得 DNS,请遵循此答案中的第一段。否则,如果您在 AWS 中有一个适用于您的域的工作托管区域,则在 Route53.
中添加一条 A 记录 在此步骤之后,如果 https 仍然无法正常工作。您可以检查对您域的请求是否到达ELB。您可以使用负载均衡器 log Accesscloudwatch 来执行此操作。他们都给你到达你的负载均衡器的请求。 cloudwatch 更易于使用,但 log Access 为您提供了有关请求的更多详细信息。
如果请求未到达,则您添加的记录尚未传播,或者您没有将它们添加到正确的位置(就像我所做的那样)。
如果请求确实到达了 ELB 但仍然存在问题,那么您可能在设置中遗漏了一些东西。确保完成问题中提到的 5 个步骤。这个 video 在这种情况下会很有帮助。
最后,值得一提的是,如果您使用来自 ACM 的证书,则无需对实例上的服务器 运行 进行任何更改即可使 https 正常工作,因为在在这种情况下,ELB 位于您的实例前面,它会为您完成所有工作。当然你可以在你的 ELB 和 实例,但这是另一个故事。

我想在这里添加我的案例。 ECS集群返回错误,docker容器 通过ECS集群和负载均衡暴露给外部世界

我遇到了与主题中提到的完全相同的错误,

SSL_ERROR_RX_RECORD_TOO_LONG

但是我的 DNS 记录使用了 CNAME 条目(上面的评论中提到了 A), 所以这部分是正确的。

您可以将此错误的故障排除分为两个阶段: 1) -运行 docker container/s,不要使用http,请求docker容器的URL, 该命令应在 运行s docker container:

的容器实例上执行

curl localhost or curl localhost:

在我的例子中,这个阶段过去了,curl 返回了一个 html 响应

2) 检查您的应用程序负载均衡器是否可以处理 https 流量 你可以通过执行命令来做到这一点:

> openssl s_client -connect <连接到负载均衡器的 dns 主机名>:443

在我的案例中,应用程序负载均衡器无法正常运行 处理 ssl 并处理证书链

请查找负载均衡器的命令输出示例 无法处理以下 https 流量:

CONNECTED(00000003)
140181833668512:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:794:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 289 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1594020928
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

为了解决第二个问题,我重新创建了一个应用程序负载均衡器, 再次配置 https 侦听器,指向列表中的证书 我帐户中的可用证书数,问题已解决。