Ошибка CloudFront при обслуживании через HTTPS с помощью SNI

Amazon недавно выпустила новую функцию в CloudFront, которая поддерживает пользовательские SSL-сертификаты бесплатно, используя SNI (указание имени сервера).

Я получил свой дистрибутив с бесплатным сертификатом класса 1 от StartSSL, и все работало, когда я заметил, что сайт будет работать через короткое время после его развертывания. Бег!--5-->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>%

хотел бы некоторые советы о том, где начать устранение неполадок.

2 ответов


добрый представитель по имени Alastair@AWS с форумов AWS CloudFront решил это для меня:

Я определил ваш дистрибутив CloudFront и ведро S3 выступая в качестве источника для этого распределения.

Я могу воссоздать и объяснить прерывистый '502 плохой шлюз' вы получаете ответ.

этот ответ возвращается CloudFront при попытке доступа к URL-адрес с использованием протокола HTTPS, который в настоящее время не используется кэшироваться CloudFront онлайн. Причина этой ошибки-CloudFront пытается обратитесь к своему источнику с помощью протокола HTTPS, и это не удается.

причина этого сбоя заключается в том, что вы настроили свой origin как Ведро S3, но вы используете тип "Custom Origin" и направляете к URL-адрес веб-сайта S3 для этого ведра. Если вы попытаетесь ударить вашего S3 URL сайта используя HTTPS, вы заметите, что это не работает. Сайт С3 хостинг поддерживает только обслуживание контента использование протокола HTTP (http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html#WebsiteRestEndpointDiff).

теперь прерывистое поведение загрузки страницы, которое вы видите, связано с CloudFront возвращает страницы, которые в настоящее время находятся в кэше. Вы должен иметь возможность воссоздать этот сценарий следующим образом:

  1. нажмите страницу на вашем сайте с помощью HTTPS. Вы должны получить ошибку "502 Bad Gateway" обратно.
  2. хит та же страница с использованием HTTP. Вы должны увидеть страницу.
  3. снова нажмите на страницу с помощью HTTPS. Теперь вы должны получить ожидаемый результат, так как CF обслуживал контент из своего кэша, а не попытка связаться с вашим происхождением.

чтобы решить эту проблему, попробуйте следующее:

  1. Откройте консоль управления CloudFront и откройте дистрибутив.
  2. перейдите на вкладку Origins, выберите origin и нажмите "Edit"
  3. измените "исходную политику протокола" на "только HTTP".
  4. сохраните изменения и подождите около 15 минут, чтобы изменения вступили в силу.
  5. тест

Я ожидаю, что это заставит CloudFront связаться с вашим происхождением использование только HTTP. Я протестировал это в своей среде с помощью S3 Веб-сайт размещен ведро, и я могу успешно загружать контент через оба HTTP и HTTPS.

здесь в ссылка на исходную тему форума.


У меня была аналогичная проблема с этим и, как предложил @Michael-sqlbot, переключился с пользовательского источника на S3. Это само по себе не решило проблему.

В дополнение к переключению источника, Эндрю из поддержки AWS сказал, что псевдонимы работают лучше, чем CNAMEs. Я использовал CNAMEs. Когда я переключился на псевдонимы (один для IPv4 и один для IPv6), это сработало. Вот это документация маршрута 53 для CloudFront это показывает, как настроить псевдонимы для CloudFront.