CloudFront 和一个 EC2 来源之间的连接如何使用 HTTPS 工作?

How does the connection between CloudFront and one EC2 origin works using HTTPS?

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

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

我们有域 example.com 的证书,而不是 self-signed,Comodo 证书。

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

我们可以使用站点 example.com with/without CDN,让两个端点提供相同的内容(example.com来源。example.com)。 没有 CDN:

User -> example.com -> Route 53 pointing directly to instance IP (that has the Comodo certificate).

使用 CDN

User -> example.com -> Route 53 pointing to ALIAS CDN -> CDN pull from origin origin.example.com

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

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

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

这个 CDN 有它自己的 example.com 亚马逊生成的 SSL 证书并且有作为源 origin.example.com.它还将主机 header 列入白名单,并添加了 CNAME 来源。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,但主机 header 设置为 example.com。因此 Nginx 以某种方式解析 example.com 虚拟主机中的值(如日志中所示,您可以在其中看到流量来自 Amazon CloudFront)。这里有什么问题?

CloudFront 如何执行连接?

我错过了什么?

谢谢!

您的设置符合预期。

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

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

这意味着如果Host header没有被列入白名单,那么源服务器必须有一个匹配源域名的证书,但是如果Host header 在处理请求的缓存行为的设置中被列入白名单,然后 CloudFront 要求您的源服务器提供与传入的 Host header、not[=39= 相匹配的证书] 源域名。

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

未列入白名单的

What CloudFront does with request headers要看具体的header。许多(如 Referer)从请求中删除,但一些(如 HostUser-Agent)被重写,而其他(如 Content-Length)仍然通过。默认操作基于 header 的目的,这些规则旨在实现正确的行为和最佳缓存。