gpt4 book ai didi

spring - Nginx HTTPS-> HTTP 使用 Spring 获取 403 "SSL required"错误

转载 作者:行者123 更新时间:2023-12-02 11:32:09 25 4
gpt4 key购买 nike

问题

当我尝试通过我的 ELB 路由到 Kubernetes Nginx 入口 Controller 时,我从 Spring 获得了 403 SSL 要求。

设置

我的设置如下:

  1. 我的 Kubernetes 集群(由 kops 创建)有一个带 ACM 的 ELB (AWS),它将所有请求路由到
  2. Nginx Ingress Controller 依次根据指定的规则路由所有请求
  3. 将流量传递给
  4. 的入口
  5. 暴露 80 端口并路由到 8080 端口的服务
  6. 使用标签“app=foobar”(在 Deployment 中描述)选择的 Pod
  7. Pod 正在运行 Spring Boot Web App v2.1.3

所以基本上:https://foo.bar.com(:443) -> 入口 -> http://foo.bar.svc.cluster.local:80

这对所有东西来说都是一种魅力。除了 SprintBoot。出于某种原因,我不断收到来自 Spring 的 403 - SSL required

这里要记住一个注意事项:我的 Spring 应用程序与 SSL 没有任何关系。我不希望它在那种性质上做任何事情。出于本示例的目的,这应该是常规 REST API 请求,SSL 终止发生在容器外部。

到目前为止我尝试了什么

  • 端口转发到服务本身并请求 - 它工作正常。
  • WebSecurityConfigurerAdapter 中禁用 CSRF
  • 放置入口注释 nginx.ingress.kubernetes.io/force-ssl-redirect=true - 当我尝试它时它给出了 TOO_MANY_REDIRECTS 错误(而不是 403)
  • 放置入口注释 nginx.ingress.kubernetes.io/ssl-redirect=true - 什么都不做
  • 放置入口注释 nginx.ingress.kubernetes.io/enable-cors: "true" - 什么都不做
  • 还有 nginx.ingress.kubernetes.io/ssl-passthrough: "true"
  • 还有 nginx.ingress.kubernetes.io/secure-backends: "true"
  • 还有 kubernetes.io/tls-acme: "true"
  • 我尝试了一大堆其他的东西,现在我真的记不起来了

它在我的集群中是什么样子

Nginx ingress controller 注释看起来像这样(我使用的是官方的 nginx ingress controller helm chart,除此之外几乎没有修改):

service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "aws_acm_certificate_arn"
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"

入口看起来像这样:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: foobar
namespace: api
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: foobar
servicePort: http
path: /

服务看起来像这样:

apiVersion: v1
kind: Service
metadata:
name: foobar
namespace: api
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
selector:
app: foobar

我认为问题是什么

我的直觉是,它与 X-Forwarded header 有关,而 Spring 在幕后发挥着它的魔力,试图变得聪明起来,并决定我需要基于某些 header 的 SSL,而无需我明确要求。但我还没有弄明白。


我四处寻找解决方案,但找不到任何东西来减轻我的痛苦……希望你能帮上忙!

编辑

我发现我当前的设置(没有 k8s 和 nginx)工作正常,ELB 通过了 X-Forwarded-Port: 443X-Forwarded-Proto: https ,它似乎有效,但在我的 nginx k8s 集群上,我放入了一个监听器客户端,它吐出所有 header ,我的 header 似乎是 X-Forwarded-Port: 80X-Forwarded-Proto: http

最佳答案

感谢所有提供帮助的人,我实际上找到了答案。在代码中有一些验证所有请求都应该来自安全来源,并且 Nginx Ingress Controller 更改了这些 header (X-Forwarded-Proto 和 X-Forwarded-Port),因为 SSL 在 ELB 中终止并作为HTTP

为了解决这个问题,我做了以下事情:

  1. 在配置映射中添加了 use-proxy-protocol: true - 它传递了正确的 header ,但出现了有关断开连接的错误(我真的不记得实际的错误是对的现在,如果有任何要求,我稍后会编辑这个答案)

  2. 为了修复这些错误,我在 nginx 入口 Controller 注释配置中添加了以下内容:

service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "tcp"

这确保了所有流量都将使用代理协议(protocol),而且我还必须将 backend-protocolHTTP 更改为 TCP .

这样做可确保所有路由到 ELB 的请求都保留其原始 X header ,并传递给 Nginx Ingress Controller,后者又传递给需要传递这些 header 的我的应用程序。

关于spring - Nginx HTTPS-> HTTP 使用 Spring 获取 403 "SSL required"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62268730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com