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

时间:2014-03-09 12:24:26

标签: amazon-web-services https ssl-certificate amazon-cloudfront

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

我使用StartSSL的免费Class 1证书设置了我的发行版,当我注意到该站点在部署后的短时间内发生故障时,一切正常。运行SSL Checker会返回我的证书正常运行:

SSL check

但是当我尝试通过HTTPS访问网站时,我会点击此错误页面(它可以用于第一个请求,然后在随后的连接尝试中关闭)。

CF error

使用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>%

非常喜欢从哪里开始排查故障。

3 个答案:

答案 0 :(得分:54)

来自AWS CloudFront论坛的Alastair @ AWS名称代表解决了这个问题:

  

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

     

我可以重新创建和解释断断续续的'502 Bad Gateway'   你收到的回复。

     

当您尝试访问某个时,CloudFront会返回此响应   使用当前未缓存的HTTPS协议的URL   CloudFront的。出现此错误的原因是CloudFront正在尝试   使用HTTPS协议联系您的来源,这是失败的。

     

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

     

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

     
      
  1. 使用HTTPS在您的网站上点击一个页面。您应该收到'502 Bad Gateway'错误。
  2.   
  3. 使用HTTP点击同一页面。你应该看到这个页面。
  4.   
  5. 使用HTTPS再次点击该页面。您现在应该得到预期的结果,因为CF已经从其缓存中提供内容而不是   试图联系你的原产地。
  6.         

    要解决此问题,请尝试以下操作:

         
        
    1. 打开CloudFront管理控制台并打开您的发行版。
    2.   
    3. 导航至“起源”选项卡,选择您的来源并单击“编辑”
    4.   
    5. 将“原始协议策略”修改为“仅HTTP”。
    6.   
    7. 保存更改并等待大约15分钟以使更改生效。
    8.   
    9. 测试
    10.         

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

这是the link to the original forum thread

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我在使用自己的SSL证书进行正确设置方面有些挣扎,但是本文对您有所帮助。只是注意细节:

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