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.com 和 origin.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
)从请求中删除,但一些(如 Host
和 User-Agent
)被重写,而其他(如 Content-Length
)仍然通过。默认操作基于 header 的目的,这些规则旨在实现正确的行为和最佳缓存。
假设我们有一个指向 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.com 和 origin.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
)从请求中删除,但一些(如 Host
和 User-Agent
)被重写,而其他(如 Content-Length
)仍然通过。默认操作基于 header 的目的,这些规则旨在实现正确的行为和最佳缓存。