Google Cloud Run для Anthos (Knative) некорректно устанавливает заголовок X-Forwarded-Proto для запросов https - PullRequest
3 голосов
/ 06 августа 2020

У меня есть приложение django, запущенное в облаке Google (в кластере Kube) через Docker, обслуживаемое uwsgi (но я пробовал runserver manage.py, и это то же самое). По умолчанию облачный запуск принимает соединения как по http, так и по https.

Я хотел бы перенаправить пользователя на версию https, но облачный запуск не показывает правильную настройку заголовков.

У меня есть обработчик, который возвращает заголовки через: json.dumps(request.headers.__dict__['_store'])

И возвращаются соответствующие заголовки:

"x-forwarded-proto": ["X-Forwarded-Proto", "http"]

Но значение http никогда не меняется, даже когда я посещаю https версия сайта.

Как django должен правильно определять HTTP-запросы при запуске облака? Я не могу использовать

SECURE_PROXY_SSL_HEADER

для обнаружения и перенаправления HTTP-запросов на https, поскольку все они кажутся HTTP-запросами, поэтому вы получаете перенаправление l oop.

Однако, если я перейду по ссылкам в этом сообщении: https://www.jhanley.com/google-cloud-run-https-part-2/

на их ссылку «показать мне заголовки», значение действительно изменится с http на https. Это что-то вроде django? Или что-то вроде "облачного запуска на кубе"?

Размещение рассматриваемого приложения в чистом облачном режиме и посещение http-версии выполняет внутреннее перенаправление на HTTPS-версию и указывает причину: Non-Authoritative-Reason: HSTS

Именно этого я и пытаюсь достичь. Кажется, что заголовки, которые я получаю, исходят от внутренней маршрутизации, а не от самого исходного запроса при работе в режиме Anthos.

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Проблема известна, и я сообщил о ней через пару месяцев go. Вы можете отслеживать это здесь в системе отслеживания проблем Google Cloud Run для Anthos.

Обходной путь, который я нашел для этой проблемы, - выполнить перенаправление на вашем интерфейсе с помощью JavaScript, проверив, установлено ли значение из window.location.protocol это http и переписываем местоположение как таковое:

window.location = "https://" + window.location.hostname + window.location.pathname + window.location.search;

1 голос
/ 06 августа 2020

Статья , которую вы связали , похоже, посвящена «Cloud Run (полностью управляемый)», но вы ее не используете. Cloud Run для Anthos (Knative) имеет совершенно другой стек для обработки запросов и завершения HTTPS. Так что, пожалуйста, не обращайте на это внимания.

Вот как создать домен с сертификатом TLS, управляемым Knative (выданным Let's Encrypt), и выполнить перенаправление HTTP → HTTPS.

Эта процедура описана в официальной документации Cloud Run: https://cloud.google.com/run/docs/gke/managed-tls

Убедитесь, что у вас кластер 1.17.7-gke.15 и более новые версии. В этих версиях функция «управляемых сертификатов» включена по умолчанию.

Создайте сопоставление домена для вашей службы. (Вы можете сделать это в Cloud Console)

Укажите записи DNS вашего домена на предоставленный вам IP-адрес (IP-сервис шлюза, который можно найти в gke-system пространстве имен Kubernetes)

Сертификат TLS будет автоматически предоставлен для вашего домена в фоновом режиме (и будет обновляться каждые 80 дней или около того)

Для настройки HTTP → HTTPS редирект, следуйте этим инструкциям , который требует, чтобы вы запустили:

kubectl annotate domainmappings [YOUR_DOMAIN] domains.cloudrun.com/httpsRedirect=Enabled

, который в основном добавляет аннотацию к объекту DomainMapping в Kubernetes.

Это настраивает входной шлюз в вашем кластере, чтобы выполнить перенаправление за вас. Вам не нужно читать заголовок x-forwarded-proto и принимать меры.

...