我已经为 AWS 应用程序负载均衡器 DNS 创建了一个 Route53 记录集。我的问题是 AWS Cloudfront 源是否可以包含此记录集 URL?
例如:ALB DNS 名称:xxxx.us-east-1.elb.amazonaws.com。Route53 中应用程序负载均衡器 DNS 的记录集条目:www.abc.com
现在我可以将 www.abc.com 作为 cloudfront 中的原点吗?
答案1
如果将 Origin Protocol 设置为 HTTPS Only,则 CloudFront 和 ELB 之间的流量将由 TLS 保护,您可以以任意方式配置实际的源域名。标Cloudfront-Forwarded-Proto
头将指示 CloudFront 和查看器之间使用的协议(因为在此配置中,负载均衡器将始终设置X-Forwarded-Proto: https
)。
CloudFront 坚持要求其自身与 Origin 之间的 TLS 协商是值得信赖的。一个经常被忽视的因素是 TLS (SSL) 证书有两个作用:提供连接加密(显而易见)和提供服务器身份验证 - 证明服务器被授权成为所请求主机名的服务器,并且不是冒名顶替者(不太明显)。这就是为什么如果服务器证书的主题和/或主题备用名称与浏览器地址栏中的主机名不匹配,您会收到浏览器警告的原因。
CloudFront 允许对此要求进行有限的例外,只要满足以下两个条件之一,证书验证即可成功:
- ELB 必须提供与源域名匹配的证书,或者
- ELB 必须提供
Host
与 CloudFront 从浏览器转发到 ELB 的标头匹配的证书。
否则,CloudFront 返回502 Bad Gateway
。
如果您使用 ELB 主机名作为源域名,则第一个条件是不可能的,这就是为什么 CloudFront 控制台Host
在发现您的目标是 ELB 时会提示您将标头列入转发白名单。
但只要你的环境看起来像这样......
www.example.com
指向 CloudFront 并在分发的备用域名中进行配置,并且- 标
Host
头配置为白名单,并且 - 将 ELB 主机名设置为源域名,并且
- ELB 拥有有效证书
www.example.com
...然后它就可以正常工作了,但有一个例外:该dzczcexample.cloudfront.net
域不能在浏览器中用于通过 CloudFront 访问您的源。在某些配置中,这是可取的,因为您实际上不希望您的内容通过第二个入口点访问。
否则,最好的选择确实是按照您的建议去做 - 将您控制的域中的主机名映射到 DNS 中的 ELB,并将该主机名配置为 CloudFront 中的原始域名。
CloudFront 可以使用任何可通过 Internet 访问的主机名作为其源 - 源不必位于 AWS 内部。举个随机示例,您可以在 CloudFront 中使用 Google Cloud Storage 存储桶作为源。CloudFront 和源之间的集成是松散的 - 我的意思是 CloudFront 对 ELB 没有特殊的认识。它只是通过公共 DNS 解析主机名并建立连接。
还要注意,如果您想确保只有您的 CloudFront 分发版可以与您的源通信,您将需要在 CloudFront 中配置一个秘密的自定义源标头,并且源需要拒绝缺少此值的请求。虽然可以使用 ELB 安全组仅允许从 CloudFront 地址空间进行访问,但该空间经常增长,您需要一种方法来保持安全组更新以允许新的地址范围……但我认为这提供了一种虚假的安全感,因为任何人都可以从技术上创建 CloudFront 分发版并将其指向任何地方,包括您的 ELB。使用自定义标头可以避免这种情况。