使用 SNI 通过 HTTPS 提供服务时出现 CloudFront 错误

Posted

技术标签:

【中文标题】使用 SNI 通过 HTTPS 提供服务时出现 CloudFront 错误【英文标题】:CloudFront error when serving over HTTPS using SNI 【发布时间】:2014-04-12 11:48:27 【问题描述】:

Amazon 最近在 CloudFront 上推出了一项新功能,该功能使用 SNI(服务器名称指示)免费支持自定义 SSL 证书。

我使用 StartSSL 提供的免费 1 类证书设置了我的发行版,当我注意到该站点在部署后不久就会关闭时,一切正常。运行 SSL Checker 返回我的证书工作正常:

但是当我尝试通过 HTTPS 访问该站点时,我会遇到此错误页面(它适用于第一个请求,然后在随后的连接尝试中失败)。

这是使用 ssl 访问时的详细输出(索引成功):

$ curl -I -v -ssl https://wikichen.is
* Adding handle: conn: 0x7f9f82804000
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7f9f82804000) send_pipe: 1, recv_pipe: 0
* About to connect() to wikichen.is port 443 (#0)
*   Trying 54.230.141.222...
* Connected to wikichen.is (54.230.141.222) port 443 (#0)
* TLS 1.2 connection using TLS_RSA_WITH_RC4_128_MD5
* Server certificate: www.wikichen.is (6w984WNu7vM5OrdU)
* Server certificate: StartCom Class 1 Primary Intermediate Server CA
* Server certificate: StartCom Certification Authority
> HEAD / HTTP/1.1
> User-Agent: curl/7.30.0
> Host: wikichen.is
> Accept: */*
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
Content-Type: text/html; charset=utf-8
< Content-Length: 1153
Content-Length: 1153
< Connection: keep-alive
Connection: keep-alive
< Date: Sun, 09 Mar 2014 16:09:54 GMT
Date: Sun, 09 Mar 2014 16:09:54 GMT
< Cache-Control: max-age=120
Cache-Control: max-age=120
< Content-Encoding: gzip
Content-Encoding: gzip
< Last-Modified: Wed, 05 Mar 2014 20:40:48 GMT
Last-Modified: Wed, 05 Mar 2014 20:40:48 GMT
< ETag: "34685bc45353d1030d3a515ddba78f3e"
ETag: "34685bc45353d1030d3a515ddba78f3e"
* Server AmazonS3 is not blacklisted
< Server: AmazonS3
Server: AmazonS3
< Age: 4244
Age: 4244
< X-Cache: Hit from cloudfront
X-Cache: Hit from cloudfront
< Via: 1.1 4f672256eaca5524999342dc8678cdd2.cloudfront.net (CloudFront)
Via: 1.1 4f672256eaca5524999342dc8678cdd2.cloudfront.net (CloudFront)
< X-Amz-Cf-Id: h4TEULH44TCi7m2lL42A8lO-5-Gmx8iY2M2C1AOmRlK543zFN6jCtQ==
X-Amz-Cf-Id: h4TEULH44TCi7m2lL42A8lO-5-Gmx8iY2M2C1AOmRlK543zFN6jCtQ==

<
* Connection #0 to host wikichen.is left intact

然后在其他页面上失败:

$ curl -i -v https://wikichen.is/writing/index.html
* Adding handle: conn: 0x7fa153804000
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7fa153804000) send_pipe: 1, recv_pipe: 0
* About to connect() to wikichen.is port 443 (#0)
*   Trying 54.230.140.160...
* Connected to wikichen.is (54.230.140.160) port 443 (#0)
* TLS 1.2 connection using TLS_RSA_WITH_RC4_128_MD5
* Server certificate: www.wikichen.is (6w984WNu7vM5OrdU)
* Server certificate: StartCom Class 1 Primary Intermediate Server CA
* Server certificate: StartCom Certification Authority
> GET /writing/index.html HTTP/1.1
> User-Agent: curl/7.30.0
> Host: wikichen.is
> Accept: */*
>
< HTTP/1.1 502 Bad Gateway
HTTP/1.1 502 Bad Gateway
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 472
Content-Length: 472
< Connection: keep-alive
Connection: keep-alive
* Server CloudFront is not blacklisted
< Server: CloudFront
Server: CloudFront
< Date: Sun, 09 Mar 2014 17:54:41 GMT
Date: Sun, 09 Mar 2014 17:54:41 GMT
< Age: 6
Age: 6
< X-Cache: Error from cloudfront
X-Cache: Error from cloudfront
< Via: 1.1 9096435f28f91f92bacdf76122de09ee.cloudfront.net (CloudFront)
Via: 1.1 9096435f28f91f92bacdf76122de09ee.cloudfront.net (CloudFront)
< X-Amz-Cf-Id: iAUOQbP8O4A0pI9KGvVz0VgBT1TW-j0yVDa7vdSvIAuxnKOyQghtnw==
X-Amz-Cf-Id: iAUOQbP8O4A0pI9KGvVz0VgBT1TW-j0yVDa7vdSvIAuxnKOyQghtnw==

<
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
</BODY></HTML>

<BR clear="all">
<HR noshade size="1px">
<ADDRESS>
Generated by cloudfront (CloudFront)
</ADDRESS>
* Connection #0 to host wikichen.is left intact
</BODY></HTML>%

希望得到一些关于从哪里开始故障排除的指示。

【问题讨论】:

我已经确认您是否仍然在原始 Web 服务器的日志中看到失败请求、云端和原始服务器之间后续请求的任何交互?另外,这里有什么有用的吗? ***.com/questions/20664018 我已经在我的发行版上同时启用了 HTTP 和 HTTPS,前者运行良好,它使用 SSL 服务存在问题。我会深入研究日志,看看我发现了什么。 S3 和 CloudFront 都会每隔几分钟写入日志并将其放入您指定的存储桶中。从这些日志中可以看到 S3 是否正在获取请求并返回云端混淆的错误或其他内容。同样有趣的是,您的错误消息本身实际上是 cached (!) Cloudfront 向您显示其Age: 6(秒)... 原始配置是一个简单的“Origin Type”=“S3 Origin” ? 感谢您的帮助 - 现在已解决。答案如下。 【参考方案1】:

来自 AWS CloudFront 论坛的一位名叫 Alastair@AWS 的好心代表为我解决了这个问题:

我已确定您的 CloudFront 分配和 S3 存储桶 作为这个分布的起源。

我可以重新创建并解释间歇性的“502 Bad Gateway” 您收到的回复。

当您尝试访问 使用 HTTPS 协议的 URL 当前未被缓存 云前。此错误的原因是 CloudFront 试图 使用 HTTPS 协议联系您的来源,但这是失败的。

此失败的原因是您已将源配置为 S3 存储桶,但您使用的是“自定义来源”类型并指向 此存储桶的 S3 网站 URL。如果你试图击中你的 S3 使用 HTTPS 的网站 URL,您会注意到这不起作用。 S3 网站 托管仅支持使用 HTTP 协议提供内容 (http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html#WebsiteRestEndpointDiff)。

现在,您看到的间歇性页面加载行为是由于 CloudFront 返回它当前在其缓存中的页面。你 应该能够重新创建这个场景,如下所示:

    使用 HTTPS 访问您网站上的页面。您应该会收到“502 Bad Gateway”错误。 使用 HTTP 访问同一页面。您应该看到该页面。 使用 HTTPS 再次访问该页面。您现在应该得到预期的结果,因为 CF 已从其缓存中提供内容,而不是 试图联系您的来源。

要解决此问题,请尝试以下方法:

    打开 CloudFront 管理控制台并打开您的分配。 导航到“原点”选项卡,选择您的原点并点击“编辑” 将“源协议策略”修改为“仅 HTTP”。 保存更改并等待大约 15 分钟以使更改生效。 测试

我的期望是这将迫使 CloudFront 联系您的来源 仅使用 HTTP。我已经在我的环境中使用 S3 对此进行了测试 网站托管存储桶,我可以通过两者成功加载内容 HTTP 和 HTTPS。

这里是the link to the original forum thread。

【讨论】:

我怀疑如果您将发行版的来源配置为“S3”而不是“自定义”来源,这可能会按原样工作,因为这将使用支持 https 的 S3 REST 接口,但是您将不会拥有所有网站端点功能,并且它仍然可能无法正常工作,因为您的存储桶名称中有一个点。感谢您找到并发布您自己的解决方案。 在 Cloudfront 中看不到源协议策略了,有什么想法吗? @RishavRastogi 您需要将 Origin 设置为网站端点,而不是 S3 存储桶。【参考方案2】:

我遇到了类似的问题,正如@Michael-sqlbot 建议的那样,从自定义来源切换到 S3。这本身并不能解决问题。

除了切换来源之外,来自 AWS 支持的 Andrew 表示,别名比 CNAME 更有效。我一直在使用 CNAME。当我切换到别名(一个用于 IPv4,一个用于 IPv6)时,它起作用了。这是Route 53 documentation for CloudFront,它展示了如何为 CloudFront 设置别名。

【讨论】:

【参考方案3】:

我在使用自己的 SSL 证书进行正确设置时遇到了一些困难,但这篇文章对我很有帮助。只需注意细节:

https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/tutorial-redirecting-dns-queries.html

【讨论】:

以上是关于使用 SNI 通过 HTTPS 提供服务时出现 CloudFront 错误的主要内容,如果未能解决你的问题,请参考以下文章

SNI

如何实现服务器名称指示 (SNI)

SNI协议分析

部署通过 expressjs 提供的反应应用程序时出现内部服务器错误 403

Apache2 错误:通过 SNI 和 HTTP 提供的主机名不匹配

通过 HTTPS 连接到 MobileFirst Server 时出现问题