无法使 HTTPS 在 CloudFront 和 Elastic BeanStalk 之间工作

Posted

技术标签:

【中文标题】无法使 HTTPS 在 CloudFront 和 Elastic BeanStalk 之间工作【英文标题】:Cannot make HTTPS work between CloudFront and Elastic BeanStalk 【发布时间】:2020-01-27 05:32:32 【问题描述】:

我正在尝试在我的应用程序中设置 HTTPS,该应用程序包含一个前端(与 CloudFront 一起分发的 S3 存储桶)和一个后端(Elastic Beanstalk 中的 node.js 应用程序)。

对于 CloudFront 部分,我在弗吉尼亚北部创建了一个 SSL 证书(显然我在这里没有选择)并在 CloudFront 分配中进行了绑定。它工作正常,我的应用程序通过 HTTPS 提供服务。

对于 Elastic Beanstalk 部分,我在爱尔兰(托管我的 EBS 应用程序)创建了一个 SSL 证书,并使用端口 443 将此证书绑定到 EBS 负载均衡器。它有效,我可以使用 HTTPS 访问我的服务器邮递员。

但是,当我的前端尝试对后端进行 API 调用时,我收到此错误:

我想我在创建证书时犯了一个错误,但我找不到它。我给了两个证书相同的 CNAMES 集,我不确定我是否应该这样做。

编辑:

更新前端后我得到完全相同的错误,因此它指向负载平衡器的 DName(也映射到具有 Route 53 的子域)。

【问题讨论】:

根据您的屏幕截图,您似乎是直接针对您的 EB 环境 URL (eu-west-1) 提出请求。您想向负载均衡器发出请求,然后负载均衡器将其传递给 EB 应用程序。在 EC2 -> 负载均衡器 (DNS name) 中选择负载均衡器后,您将在描述部分找到此内容。虽然理想情况下您会使用 Route53 将域/子域映射到此资源,然后针对该资源进行调用。 @dusthaines 我只是按照你说的做了,但我仍然得到完全相同的错误。我在 Route 53 中创建了一个别名,将“debug.api.djumbo.net”映射到负载均衡器的 DName。我还应该更新证书本身吗? @dusthaines 在这里没有任何帮助,它们都是指向同一个负载均衡器的 DNS 记录。问题是负载均衡器上安装的 SSL 证书不(也不能)匹配这些域名中的任何一个。要在此处在负载均衡器上使用 SSL 证书,需要使用与 SSL 证书匹配的自定义域,否则您会在上面的屏幕截图中收到 SSL 证书验证错误。 【参考方案1】:

CloudFront 正在尝试从您的负载均衡器加载 HTTPS URL。我假设您已为负载均衡器分配了 SSL 证书。负载均衡器上 SSL 证书的域名需要与 CloudFront 请求的域名匹配。

例如,如果负载均衡器的 SSL 证书类似于 beanstalk.mydomain.com,则 CloudFront 需要发出对 https://beanstalk.mydomain.com 的请求。 CloudFront 给您的错误表明负载均衡器提供的 SSL 证书的域名与域名 djumbo-back-debug.eu-west-1.elasticbeanstalk.co 不匹配。

您需要进行如下设置:

DNS 名称 www.mydomain.com 指向 CloudFront 分配

配置为服务www.mydomain.com 为域www.mydomain.com 配置了 SSL 证书 配置从源beanstalk.mydomain.com拉取

DNS 名称 beanstalk.mydomain.com 指向 Elastic Beanstalk 应用程序

带有负载均衡器,带有beanstalk.mydomain.com 的 SSL 证书

【讨论】:

非常感谢。我的错误是我没有为 EBS SSL 证书输入正确的 CName。我输入了djumbo.net*.djumbo.net,希望它能覆盖debug.api.djumbo.net,但它没有。我用 CNames api.djumbo.netdebug.api.djumbo.net 创建了一个新证书,现在它可以工作了:) @Louis - 最后一个整理顺序 - 考虑为 HTTP : 80 添加一个侦听器到负载均衡器,规则为:Redirect to... HTTPS 443。不是世界末日,但如果有人在没有协议的情况下进入您的域,这将确保所有流量都通过 SSL。您注意到的调试域的快速测试看起来您没有到位(https 得到 200 而http 失败)。祝你好运! @dusthaines 如果请求应该来自 CloudFront,为什么要在负载均衡器上打开额外的端口?我会在 CloudFront 上设置 HTTP->HTTPS 重定向,并在负载均衡器上只保留最小配置以允许 CloudFront 连接到它。 @MarkB - 据我了解基于 Louis 原始问题的架构,有两个主要资产:前端⟶ [通过 CloudFront 的 S3] 和后端⟶ [通过 EC2 LB 的 EB]。每个都有自己的子域。因此 CloudFront 的协议配置不会影响 LB,反之亦然。我的建议可能是过分的,因为前端可能是向后端发出请求的单个客户端。但尽管如此,后端确实有一个唯一的 DNS 端点,如果要公开或与其他人共享,我认为最好计划所有流量都通过 HTTPS 流动。 @dusthaines 我将其解读为 CloudFront 通过 HTTPS 连接到 Elastic Beanstalk。如果不是这种情况,那么问题标题就没有意义了。不过,在再次阅读该问题后,我认为您是正确的,并且该问题通过包含一些完全不相关的 CloudFront 信息来混淆问题。

以上是关于无法使 HTTPS 在 CloudFront 和 Elastic BeanStalk 之间工作的主要内容,如果未能解决你的问题,请参考以下文章

CloudFront 无法与 ELB 502 错误网关通信

单个域缓存失效 AWS CloudFront

在 CloudWatch 仪表板中查看 CloudFront 指标

在 CloudFront 中从一个源同时设置 https 和 http

如何使 CloudFront 永远不会在 S3 存储桶上缓存 index.html

Rails assets_host、cloudfront 和 heroku