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

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

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

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

Ответ 1

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

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

Я могу воссоздать и объяснить прерывистый "502 Bad Gateway", ответ, который вы получаете.

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

Причиной этого отказа является то, что вы настроили свое происхождение как S3, но вы используете тип "Custom Origin" и направляете URL сайта S3 для этого ведра. Если вы попытаетесь поразить свой S3 URL сайта с использованием HTTPS, вы заметите, что это не работает. Сайт 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.

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

Ответ 2

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

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