Распределение настраиваемого источника Cloudfront возвращает 502 ОШИБКА. Запрос не может быть удовлетворен. для некоторых URL

У нас есть дистрибутив Cloudfront с настраиваемым происхождением, который довольно долго работает нормально, обслуживая статические ресурсы для одного из наших сайтов. Буквально сегодня утром мы заметили, что наш логотип отображается как неработающая ссылка.

После дальнейшего расследования Cloudfront возвращает странное сообщение об ошибке, которое я никогда раньше не видел для рассматриваемого URL :

ОШИБКА

Запрос не может быть удовлетворен.



Создано CloudFront (CloudFront)

Несколько других URL-адресов Cloudfront из этого дистрибутива возвращают ту же ошибку, но другие (опять же из того же дистрибутива) работают нормально. Я не вижу закономерности в отношении того, что работает, а что нет.

Некоторые другие данные:

  • исходные URL работают нормально. Насколько мне известно, в последнее время в обслуживании не было перебоев.
  • Я специально аннулировал URL-адрес логотипа, но безрезультатно.
  • Я сделал недействительным корневой URL-адрес дистрибутива, но безрезультатно.

Есть идеи, что здесь происходит? Я никогда раньше не видел, чтобы Cloudfront делал это.

ОБНОВЛЕНИЕ:

Вот дословный HTTP-ответ от Cloudfront:

$ http GET https://d2yu7foswg1yra.cloudfront.net/static/img/crossway_logo.png
HTTP/1.1 502 Bad Gateway
Age: 213
Connection: keep-alive
Content-Length: 472
Content-Type: text/html
Date: Wed, 18 Dec 2013 17:57:46 GMT
Server: CloudFront
Via: 1.1 f319e8962c0268d31d3828d4b9d41f98.cloudfront.net (CloudFront)
X-Amz-Cf-Id: H_HGBG3sTOqEomHzHubi8ruLbGXe2MRyVhGBn4apM0y_LjQa_9W2Jg==
X-Cache: Error from cloudfront

<!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>
</BODY></HTML>

person David Eyk    schedule 18.12.2013    source источник
comment
Интересно .... Я только что создал свой первый дистрибутив (без специального CNAME) и получаю то же самое. Начал со всего простого, но пока не повезло.   -  person Shawn Dube    schedule 18.12.2013
comment
Да, я создал новый дистрибутив для тестирования, и то же самое. : \   -  person David Eyk    schedule 18.12.2013
comment
У меня была аналогичная проблема, хотя у меня был тайм-аут шлюза 504 для некоторых статических файлов из дистрибутива CloudFront. Я понял, что включил pglcmd, который блокировал диапазоны IP-адресов через iptables. Я до сих пор не знаю, почему CloudFront проверял эти файлы, для которых установлен срок действия заголовков на один год.   -  person paradroid    schedule 27.03.2014


Ответы (14)


Недавно у меня была аналогичная проблема, которая, как выяснилось, была связана с ssl_ciphers, который я использовал.

Из http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html,

"CloudFront перенаправляет запросы HTTPS на исходный сервер, используя протоколы SSLv3 или TLSv1 и шифры AES128-SHA1 или RC4-MD5. Если ваш исходный сервер не поддерживает шифры AES128-SHA1 или RC4-MD5, CloudFront не может установить соединение SSL. к вашему происхождению ".

Мне пришлось изменить мою конфигурацию nginx, чтобы добавить AES128-SHA (устаревший RC4: HIGH) в ssl_ciphers, чтобы исправить ошибку 302. Надеюсь, это поможет. Я вставил строку из своего ssl.conf

ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:AES128-SHA:!ADH:!AECDH:!MD5;
person dminer    schedule 28.04.2014
comment
Это кажется правильным решением моей конкретной проблемы, хотя кажется, что может быть несколько способов получить это сообщение об ошибке, отраженное в других ответах здесь. - person David Eyk; 26.06.2014
comment
Вы можете использовать AES128-SHA вместо RC4:HIGH. Использование RC4:HIGH снизило мою оценку Qualsys SSL Labs с A до C. - person David Eyk; 26.06.2014
comment
Это также устранило мою проблему. Однако мне пришлось использовать AES128-SHA1 с 1. Без 1 это не сработало для меня. Кроме того, AWS рекомендует использовать TLSv1, а не SSLv3, что менее безопасно. - person bmorenate; 17.12.2016

У меня сегодня была эта ошибка с Amazon Cloudfront. Это произошло из-за того, что cname, которое я использовал (например, cdn.example.com), не был добавлен в настройки распространения в разделе «Альтернативные cnames», у меня только cdn.example.com был перенаправлен в облачный домен на моем сайте / панели управления хостингом, но вам также необходимо добавить его в панель Amazon CloudFront.

person adrianTNT    schedule 12.05.2014
comment
В моем случае это была опечатка в CNAME. Ага! - person maksimov; 25.12.2014
comment
Спасибо, это исправлено! - person Matt Vukas; 27.01.2015
comment
После добавления альтернативного CNAME требуется некоторое время, чтобы Статус распространения CloudFront (на вкладке «Общие») перешел с «InProgress» на «Deployed». В течение этого времени вы все равно будете получать аналогичное сообщение об ошибке CloudFront. В моем случае это заняло около получаса. - person idoimaging; 19.01.2017
comment
Для некоторых, чтобы найти изменение cname: перейдите в CloudFront section = ›выберите свой cloudfront =› выберите General = ›Edit =› добавьте URL-адрес CNAME в Alternate Domain Names (CNAMEs) (он находится в 3-й строке) - person seuling; 12.07.2018

Нашел свой ответ и добавил его здесь, если он поможет Дэвиду (и другим).

Оказывается, на моем исходном сервере (скажем, www.example.com) была настроена переадресация 301 для изменения HTTP на HTTPS:

HTTP/1.1 301 Moved Permanently
Location: https://www.example.com/images/Foo_01.jpg

Однако моя политика протокола происхождения была настроена только на HTTP. Это привело к тому, что CloudFront не смог найти мой файл и выдал ошибку 502. Кроме того, я думаю, что он кэшировал ошибку 502 в течение 5 минут или около того, так как он не работал сразу после удаления этого перенаправления 301.

Надеюсь, это поможет!

person Shawn Dube    schedule 18.12.2013
comment
Хм! Не совсем моя ситуация, но держу пари, что это действительно близко. - person David Eyk; 19.12.2013
comment
Вы уверены? Я запустил ваш URL-адрес как http и получил: HTTP / 1.1 301 Постоянно перемещен Сервер: nginx / 0.7.65 Дата: 19 декабря 2013 г., 05:00:15 GMT Content-Type: text / html Content-Length: 185 Соединение: сохранить -alive Location: my.crossway.org/static/img/crossway_logo.png ‹Html› ‹head› ‹title› 301 Перемещено постоянно ‹/title› ‹/head› ‹body bgcolor = white› ‹center› ‹h1› 301 Перемещено постоянно ‹/h1› ‹/center› ‹hr› ‹center› nginx / 0.7.65 ‹/center› ‹/body› ‹/html› - person Shawn Dube; 19.12.2013
comment
Но я не использую HTTP Only в своей политике происхождения, я использую Match Viewer. Странно то, что до недавнего времени он работал нормально. - person David Eyk; 19.12.2013
comment
Я думаю, что даже если вы используете «просмотрщик матчей», это может вызвать проблемы, даже если этого не должно быть. Я попал в то же самое, где у меня был 301 на домашней странице, и он разбил эту страницу на 5-минутную длину кеша. - person Peter; 20.12.2014

В нашем случае все выглядело нормально, но на то, чтобы разобраться в этом, ушла большая часть дня:

TL; DR: проверьте пути сертификатов, чтобы убедиться в правильности корневого сертификата. В случае сертификатов COMODO в нем должно быть написано «USERTrust», и он должен выдаваться «AddTrust External CA Root». НЕ «COMODO», выданный «Центром сертификации COMODO RSA».

Из документации CloudFront: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html

Если исходный сервер возвращает недействительный сертификат или самозаверяющий сертификат, или если исходный сервер возвращает цепочку сертификатов в неправильном порядке, CloudFront разрывает TCP-соединение, возвращает код ошибки HTTP 502 и устанавливает для заголовка X-Cache значение «Ошибка». от облачного фронта.

У нас были включены правильные шифры в соответствии с: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#RequestCustomEncryption

Наш сертификат действителен согласно Google, Firefox и ssl-checker: https://www.sslshopper.com/ssl-checker.html

Результат проверки SSL без всех необходимых сертификатов

Однако последним сертификатом в цепочке проверки ssl был «ЦС безопасного сервера для проверки домена COMODO RSA», выданный «Центром сертификации COMODO RSA».

Похоже, что CloudFront не имеет сертификата для «центра сертификации COMODO RSA» и считает, что сертификат, предоставленный исходным сервером, является самоподписанным.

Это работало долгое время, прежде чем внезапно прекратилось. Произошло то, что я только что обновил наши сертификаты за год, но во время импорта что-то было изменено в пути к сертификату для всех предыдущих сертификатов. Все они начали ссылаться на «Центр сертификации COMODO RSA», тогда как раньше цепочка была длиннее, а корнем был «AddTrust External CA Root».

Неверный путь к сертификату

Из-за этого возврат к старому сертификату не устранил проблему облачного интерфейса.

Мне пришлось удалить дополнительный сертификат с именем «COMODO RSA Certification Authority», тот, который не ссылался на AddTrust. После этого все пути к сертификатам моих веб-сайтов обновились, чтобы снова указывать на AddTrust / USERTrust. Примечание также может открыть неверный корневой сертификат по пути, щелкнуть «Подробности» -> «Изменить свойства», а затем отключить его таким образом. Это немедленно обновило путь. Вам также может потребоваться удалить несколько копий сертификата, которые находятся в разделах «Личный» и «Доверенные корневые центры сертификации».

Хороший путь к сертификату

Наконец, мне пришлось повторно выбрать сертификат в IIS, чтобы заставить его обслуживать новую цепочку сертификатов.

После всего этого ssl-checker начал отображать третий сертификат в цепочке, который указывал на «AddTrust External CA Root».

Проверка SSL со всеми сертификатами

Наконец, CloudFront принял сертификат исходного сервера и предоставленную цепочку как доверенные. Наша CDN снова заработала корректно!

Чтобы этого не произошло в будущем, нам нужно будет экспортировать наши вновь сгенерированные сертификаты с машины с правильной цепочкой сертификатов, то есть не доверять или удалить сертификат «COMODO RSA Certification Authroity», выданный «COMODO RSA Certification Authroity» (срок действия истекает в 2038 году). ). Это влияет только на машины с Windows, на которых этот сертификат установлен по умолчанию.

person Eddie Fletcher    schedule 04.06.2015

Еще одно возможное решение: у меня есть промежуточный сервер, который обслуживает сайт и ресурсы Cloudfront через HTTP. У меня было выбрано "Средство просмотра совпадений" вместо "Только HTTP". Я также использую расширение HTTPS Everywhere, которое перенаправляет все http://*.cloudfront.net URL-адреса на https://* версию. Поскольку промежуточный сервер недоступен через SSL, а Cloudfront соответствовал программе просмотра, он не смог найти ресурсы в https://example.com и вместо этого кэшировал кучу 502.

person Devin    schedule 15.06.2015

Я только что решил устранить эту проблему, и в моем случае это действительно было связано с перенаправлением, но не связано с неправильными настройками в моем CloudFront Origin или Behavior. Это произойдет, если ваш исходный сервер все еще перенаправляет на исходные URL-адреса, а не на те, которые вы настроили для своих облачных URL-адресов. Кажется, это очень распространенное явление, если вы забываете изменить конфиги. Например, допустим, у вас есть CNAME www.yoursite.com для вашего облачного дистрибутива с источником www.yoursiteorigin.com. Очевидно, что люди будут заходить на сайт www.yoursite.com. Но если ваш код пытается перенаправить на любую страницу на www.yoursiteorigin.com, вы получите эту ошибку.

Для меня источник по-прежнему выполнял перенаправления http-> https на мои исходные URL-адреса, а не на мои URL-адреса Cloudfront.

person Peter    schedule 20.12.2014

В моем случае это произошло из-за того, что у нас был недействительный сертификат ssl. Проблема была в нашей промежуточной коробке, и мы также используем наш сертификат продукта. Последние пару лет он работал с этой конфигурацией, но внезапно мы начали получать эту ошибку. Странный.

Если другие получают эту ошибку, убедитесь, что сертификат ssl действителен. Вы можете включить ведение журнала в s3 через интерфейс AWS CloudFront Distribution, чтобы облегчить отладку.

Кроме того, вы можете обратиться к документации Amazon по этому вопросу здесь: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html

person Peter P.    schedule 23.01.2015

Я столкнулся с этой проблемой, которая разрешилась сама собой после того, как я перестал использовать прокси. Возможно, CloudFront заносит некоторые IP-адреса в черный список.

person lid    schedule 01.04.2014

Исправлена ​​эта проблема путем объединения моих сертификатов для создания действительной цепочки сертификатов (с использованием GoDaddy Standard SSL + Nginx).

http://nginx.org/en/docs/http/configuring_https_servers.html#chains

Чтобы сгенерировать цепочку:

cat 123456789.crt gd_bundle-g2-g1.crt > my.domain.com.chained.crt

Потом:

ssl_certificate /etc/nginx/ssl/my.domain.com.chained.crt;
ssl_certificate_key /etc/nginx/ssl/my.domain.com.key;

Надеюсь, это поможет!

person Pedro    schedule 13.11.2015

В моем случае проблема заключалась в том, что я использовал Amazon Cloudflare и Cloudfront Cloudfront в тандеме, и Cloudfront не понравились настройки, которые я предоставил Cloudflare.

В частности, в настройках Crypto на Cloudflare я установил «Минимальные настройки TLS» на 1.2, не включив настройку связи TLS 1.2 для распространения в Cloudfront. Этого было достаточно, чтобы Cloudfront объявил ошибку 502 Bad Gateway при попытке подключения к серверу, защищенному Cloudflare.

Чтобы исправить это, мне пришлось отключить поддержку SSLv3 в настройках Origin для этого дистрибутива Cloudfront и включить TLS 1.2 в качестве поддерживаемого протокола для этого исходного сервера.

Чтобы отладить эту проблему, я использовал версии curl для командной строки, чтобы увидеть, что Cloudfront фактически возвращал, когда вы запрашивали изображение из его CDN, а также я использовал версию openssl для командной строки, чтобы точно определить, какие протоколы Cloudflare были. предложение (он не предлагал TLS 1.0).

tl: dr; к тому времени, как вы это прочитаете, убедитесь, что все принимает и запрашивает TLS 1.2 или любой последний и лучший TLS, который все используют.

person johnwbyrd    schedule 06.07.2018

В моем конкретном случае это было связано с тем, что исходный ALB за моим поведением CloudFront имел сертификат ACM ПО УМОЛЧАНИЮ, который указывал на другое доменное имя.

Чтобы исправить это, мне пришлось:

  1. Перейти к ALB
  2. На вкладке Listeners выберите my Listener и затем Edit
  3. Под сертификатом SSL по умолчанию выберите правильный исходный сертификат.
person Paco G    schedule 13.07.2020

В моем случае я использую nginx в качестве обратного прокси для URL-адреса шлюза API. У меня такая же ошибка.

Я решил проблему, когда добавил в конфигурацию Nginx следующие две строки:

proxy_set_header Host "XXXXXX.execute-api.REGION.amazonaws.com";
proxy_ssl_server_name on;

Источник находится здесь: Настройка proxy_pass на nginx для выполнения вызовов API к API Gateway

person Adil    schedule 22.02.2018

В нашем случае мы отказались от поддержки SSL3, TLS1.0 и TLS1.1 для соответствия PCI-DSS на наших исходных серверах. Однако вам необходимо вручную добавить поддержку TLS 1.1+ в конфигурацию исходного сервера CloudFront. Консоль AWS отображает настройки SSL между клиентом и CF, но не может легко показать вам настройки CF-to-origin, пока вы не выполните детализацию. Чтобы исправить, в консоли AWS в CloudFront:

  1. Щелкните РАСПРЕДЕЛЕНИЕ.
  2. Выберите свой дистрибутив.
  3. Щелкните вкладку ИСТОЧНИКИ.
  4. Выберите ваш исходный сервер.
  5. Щелкните ИЗМЕНИТЬ.
  6. Выберите все протоколы, которые поддерживает ваш источник, в разделе «Протоколы SSL источника».
person leiavoia    schedule 09.04.2018

Остерегайтесь политики протокола происхождения:

Для запросов средства просмотра HTTPS, которые CloudFront пересылает этому источнику, одно из доменных имен в сертификате SSL на исходном сервере должно совпадать с именем домена, которое вы указали в качестве имени домена источника. В противном случае CloudFront отвечает на запросы средства просмотра кодом состояния HTTP 502 (Плохой шлюз) вместо того, чтобы возвращать запрошенный объект.

В большинстве случаев вы, вероятно, захотите, чтобы CloudFront использовал только HTTP, поскольку он извлекает объекты с сервера, который, вероятно, также размещен на Amazon. На этом этапе нет необходимости в дополнительных сложностях HTTPS.

Обратите внимание, что это отличается от Viewer Политика протокола. Вы можете узнать больше о различиях между двумя здесь < / а>.

person Paul Razvan Berg    schedule 12.08.2020