Как соединение между CloudFront и одним источником EC2 работает с использованием HTTPS? - PullRequest
0 голосов
/ 16 января 2019

Предположим, у нас есть домен example.com , указывающий на экземпляр EC2, который разрешает трафик HTTPS и HTTP (перенаправление на HTTPS).

Этот экземпляр имеет экземпляр WordPress, работающий под Nginx.

У нас есть сертификат для домена example.com, а не самозаверяющий, сертификат Comodo.

Мы хотим добавить CloudFront к полному example.com , поэтому мы создаем CDN между пользователем и экземпляром EC2.

Мы могли бы использовать сайт example.com с / без CDN, имея две конечные точки, обслуживающие один и тот же контент ( example.com и origin.example.com ). Без CDN:

Пользователь -> example.com -> Маршрут 53, указывающий напрямую на экземпляр IP (который имеет сертификат Comodo).

С CDN

Пользователь -> example.com -> Маршрут 53, указывающий на ALIAS CDN -> CDN pull из источника origin.example.com

origin.example.com будет иметь тот же контент, что и example.com (оба хоста Nginx указывают одинаково), и там мы должны разрешать только трафик из CDN, но это другая тема.

Для достижения этой цели мы создаем еще одну конечную точку, origin.example.com , с самозаверяющим сертификатом (с использованием давайте шифровать), размещаемую на том же сервере (тот же IP-адрес).

Идея состоит в том, чтобы отправить трафик с CDN на origin.example.com и оттуда извлечь контент.

Этот CDN имеет собственный example.com SSL-сертификат, сгенерированный Amazon и имеющий в качестве источника origin.example.com . Он также содержит заголовок хоста в белом списке и добавлен CNAME origin.example.com.

Все работает как положено. Если вы посещаете example.com, вы получаете контент из CDN.

Проблема? Если вы проверите журналы экземпляров (бот example.com и origin.example.com установлены в одном и том же экземпляре EC2), CDN НЕ вызывает origin.example. com , как и следовало ожидать, он вызывает ВСЕГДА example.com . Как это возможно?

Я установил журналы для CloudFront, и в этом журналы выглядят так:

2019-01-10 15:35:47 MAD50 27633 83.59.32.239 GET xxxxxx.cloudfront.net / mycontent / 200 https://example.com/lalala - - Мисс 5о… nX1hEbw == example.com https 566 0,140 - TLSv1 .2 ECDHE-RSA-AES128-GCM-SHA256 Мисс HTTP / 2.0 - -

Я думаю, это связано с полем белого списка Host.

Итак, похоже, CloudFront отправляет запрос origin.example.com , но заголовок Host установлен на example.com . Таким образом, Nginx каким-то образом анализирует значение в виртуальном хосте example.com (как показано в журналах, где видно, что трафик поступает из Amazon CloudFront). Что здесь не так?

Как CloudFront выполняет соединение?

Чего мне не хватает?

Спасибо!

1 Ответ

0 голосов
/ 16 января 2019

Ваша установка ведет себя как ожидалось.

Когда заголовок Host внесен в белый список для пересылки, CloudFront подключается к источнику , используя имя домена источника для поиска DNS, но заголовок Host не изменяется в соответствии с именем домена источника - вместо этого он копируется из исходного запроса, отправленного браузером, , потому что для этого используется белый список . Если не занесен в белый список, CloudFront устанавливает Host в значение исходного доменного имени.

Кроме того, для HTTPS: если заголовок Host находится в белом списке, CloudFront позволяет вашему серверу происхождения использовать сертификат, соответствующий либо заголовок Host или Домен происхождения Название. Если заголовок Host не занесен в белый список, то на исходном сервере должен быть сертификат, соответствующий имени исходного домена. В противном случае запрос завершится неудачно с 502 Bad Gateway, поскольку CloudFront считает, что источник неправильно настроен, так как соединение не защищено при несовпадении сертификата.

Что CloudFront делает с заголовками запросов , которые не входят в белый список, зависит от конкретного заголовка. Многие (например, Referer) удаляются из запроса, но некоторые (например, Host и User-Agent) переписываются, а другие (например, Content-Length) все равно проходят. Действия по умолчанию основаны на назначении заголовка, и эти правила предназначены для правильного поведения и оптимального кэширования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...