【问题标题】:How does the connection between CloudFront and one EC2 origin works using HTTPS?CloudFront 和一个 EC2 源之间的连接如何使用 HTTPS 工作?
【发布时间】:2019-06-09 23:54:18
【问题描述】:

假设我们有一个域 example.com 指向一个 EC2 实例,它允许 HTTPS 和 HTTP(重定向到 HTTPS)流量。

这个实例有一个在 Nginx 下运行的 WordPress 实例。

我们有一个域 example.com 的证书,不是自签名的 Comodo 证书。

我们想将 CloudFront 添加到完整的 example.com,因此我们在用户和 EC2 实例之间创建了一个 CDN。

我们可以使用带有/不带有 CDN 的站点 example.com,方法是让两个端点提供相同的内容(example.comorigin.example。 com)。 没有 CDN:

用户 -> example.com -> Route 53 直接指向实例 IP(具有 Comodo 证书)。

使用 CDN

用户 -> example.com -> Route 53 指向 ALIAS CDN -> CDN 从 origin origin.example.com 拉取

origin.example.com 将具有与 example.com 相同的内容(两个 Nginx 主机指向相同),我们应该只允许来自 CDN 的流量,但这是一个不同的主题.

为了实现这一点,我们创建了另一个端点,origin.example.com,它带有一个自签名证书(使用 let's encrypt),放置在同一台服务器(相同的 IP 地址)中。 p>

这个想法是将流量从 CDN 发送到 origin.example.com,然后从那里获取内容。

此 CDN 有其自己的 example.com 由 Amazon 生成的 SSL 证书,来源为 origin.example.com。它还将 Host 标头列入白名单,并添加了 CNAME origin.example.com。

一切都按预期进行。如果您访问 example.com,您会从 CDN 获取内容。

问题?如果您检查实例日志(bot example.comorigin.example.com 设置在同一个 EC2 实例中),CDN 不会调用 origin。 example.com,正如预期的那样,它总是调用 example.com。怎么可能?

我为 CloudFront 设置了日志,在这个日志中是这样的:

2019-01-10 15:35:47 MAD50 27633 83.59.32.239 GET xxxxxx.cloudfront.net /mycontent/ 200 https://example.com/lalala - - Miss 5o…nX1hEbw== example.com https 566 0.140 - TLSv1.2 ECDHE -RSA-AES128-GCM-SHA256 Miss HTTP/2.0 - -

我认为这是由于主机白名单字段。

因此,看起来 CloudFront 将请求发送到 origin.example.com,但 Host 标头设置为 example.com。因此,Nginx 以某种方式解析了 example.com 虚拟主机中的值(如日志中所示,您可以在其中看到流量来自 Amazon CloudFront)。这里有什么问题?

CloudFront 如何执行连接?

我错过了什么?

谢谢!

【问题讨论】:

    标签: amazon-ec2 https amazon-cloudfront


    【解决方案1】:

    您的设置按预期运行。

    Host 标头被列入转发白名单时,CloudFront 仍然连接到源 使用源域名进行 DNS 查找,但 Host 标头未更改以匹配源默认情况下的域名 - 相反,它是从浏览器发送的原始请求中复制的,因为这(本质上)是将此标头列入白名单的目的。 (将标头列入白名单还会将标头添加到请求的缓存键中,因此当该标头被列入白名单时,只有传入的 Host 标头不同的请求将被视为不同。)如果未列入白名单,则将 Host 标头发送到源由 CloudFront 设置为源域名的值。

    对于从 CloudFront 到源的 HTTPS,CloudFront 将 SNI(在与源的 TLS 协商期间)设置为使用上述规则为 Host 标头选择的值,并要求源服务器返回证书匹配该值。

    这意味着如果 Host 标头未列入白名单,则源服务器必须具有与源域名匹配的证书,但如果 Host 标头在处理请求,然后 CloudFront 要求您的源服务器提供与传入的 Host 标头匹配的证书,不是源域名。

    如果不匹配适当的规则,the request fails with 502 Bad Gateway,因为 CloudFront 认为源配置错误,因为当证书不匹配时连接不安全。

    What CloudFront does with request headers 未列入白名单取决于具体的标头。许多(如Referer)从请求中删除,但一些(如HostUser-Agent)被重写,而另一些(如Content-Length)无论如何都会通过。默认操作基于标头的用途,这些规则旨在实现正确的行为和优化缓存。

    【讨论】:

    • 谢谢!这是一个绝妙的答案!这是否意味着我不需要设置 origin.example.com ?我的意思是,如果我理解您的解释,我可以将 EC2 DNS 名称 ec2-****.compute-1.amazonaws.com 设置为来源,并使用我在指向时安装的相同 example.com SSL 证书域直接连接到 EC2 实例。谢谢!
    • 是的,您可以这样设置,但需要注意的是系统分配的 dzczcexample.cloudfront.net 主机名不能用于测试,因为您的原始证书当然永远不会匹配。
    • @Michael-sqlbot 对此不确定:此外,对于 HTTPS:如果主机标头被列入白名单,则 CloudFront 允许您的源服务器使用与主机标头或源域名匹配的证书。根据您链接的文档:此外,如果您将 CloudFront 配置为将 Host 标头转发到您的源,则源必须使用与 Host 标头中的域匹配的证书进行响应。所以我认为你的答案部分不正确?
    • @Stephane,你是绝对正确的。固定的。我不知道我写的时候在想什么。感谢您的评论,如果您发现任何其他需要注意的地方,请随时告诉我。
    猜你喜欢
    • 2020-01-27
    • 2017-02-09
    • 2020-10-24
    • 1970-01-01
    • 2017-12-03
    • 2021-02-19
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多