Google Cloud Run for Anthos(Knative)未在 https 请求上正确设置 X-Forwarded-Proto 标头

Posted

技术标签:

【中文标题】Google Cloud Run for Anthos(Knative)未在 https 请求上正确设置 X-Forwarded-Proto 标头【英文标题】:Google Cloud Run for Anthos (Knative) not setting X-Forwarded-Proto header correctly on https requests 【发布时间】:2020-11-26 14:42:41 【问题描述】:

我有一个 django 应用程序在谷歌云中运行(在 Kube 集群中),通过 uwsgi 服务的 Docker(但我已经尝试过 manage.py runserver 并且它是相同的)。默认情况下,云运行接受 http 和 https 上的连接。

我想将用户重定向到 https 版本,但 cloud run 没有正确设置标头。

我有一个处理程序,它通过以下方式返回标头:json.dumps(request.headers.__dict__['_store'])

并且返回的相关标头是:

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

但即使我访问 https 版本的网站,http 的值也不会改变。

django 应该如何正确检测云上运行的 http 请求?我无法使用

SECURE_PROXY_SSL_HEADER

检测http请求并将其重定向到https,因为它们似乎都是http请求,因此您最终会陷入重定向循环。

但是,如果我点击这篇文章中的链接:https://www.jhanley.com/google-cloud-run-https-part-2/

到他们的“显示标题”链接,该值确实从 http 更改为 https。这是一个django的东西吗?还是“在 kube 上运行云”的东西?

在纯云上托管有问题的应用程序并访问 http 版本会内部重定向到 HTTPS 版本并给出原因:Non-Authoritative-Reason: HSTS

这正是我想要实现的目标。我得到的标头似乎来自内部路由,而不是在 Anthos 模式下运行时的原始请求本身。

【问题讨论】:

【参考方案1】:

article you linked 似乎与“Cloud Run(完全托管)”有关,但您没有使用它。 Cloud Run for Anthos (Knative) 有一个完全不同的堆栈来处理请求和 HTTPS 终止。所以请忽略。


以下是如何使用由 Knative 管理的 TLS 证书(由 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 地址(可以在 gke-system Kubernetes 命名空间中找到的网关 IP 服务)

    将在后台为您的域自动配置 TLS 证书(并将每 80 天左右更新一次)

    要设置 HTTP→HTTPS 重定向,follow these instructions 需要您运行:

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

    这基本上是在 Kubernetes 中为 DomainMapping 对象添加注释。

    这会将集群中的入口网关配置为为您执行重定向。 您无需阅读x-forwarded-proto 标头并采取行动。

【讨论】:

我已经阅读了很多文档页面,但不知何故我错过了那个页面。谢谢!【参考方案2】:

这个问题是已知的,我在几个月前报告了它。您可以在 Google Cloud Run for Anthos 问题跟踪器上跟踪它here。

我为这个问题找到的解决方法是使用 javascript 在前端进行重定向,方法是检查 window.location.protocol 的值是否为 http 并重写位置:

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

【讨论】:

我接受了另一个答案,因为它将解决问题,但感谢您的建议。

以上是关于Google Cloud Run for Anthos(Knative)未在 https 请求上正确设置 X-Forwarded-Proto 标头的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Tasks 无法向 Cloud Run 进行身份验证

从 Google Cloud Run 服务中的 docker 容器到 Google Cloud SQL 的请求最多需要 2 分钟

监控 Google Cloud Run 内存使用情况

Google Cloud Run 最终用户身份验证

Stackdriver Trace 与 Google Cloud Run

将 env 变量从 Google 的 Secret Manager 加载到在 Google Cloud Run 上运行但未通过 Cloud Build 部署的 Docker 容器中?