微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不要在 Kubernetes 的入口级别终止 SSL

如何解决不要在 Kubernetes 的入口级别终止 SSL

我有一个 Java 应用程序在 tomcat 服务器(位于 pod 内)中运行,该应用程序配置为使用 https。 我正在使用 Nginx 入口。问题是,Nginx 入口正在终止 SSL 并仅将普通 http 转发到 tomcat 服务器(实际上是到 pod)。由于 tomcat 服务器配置为仅使用 HTTPS,因此不接受流量。

以下不起作用:

Nginx.ingress.kubernetes.io/ssl-passthrough: "true"

解决方法

我终于找到了答案:

我必须添加以下两行:

nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"

所以入口是这样的(我还添加了一些评论来描述并展示我尝试过但没有奏效的选项,以免浪费时间):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-resource-staging
  namespace: staging-space
  annotations:
    kubernetes.io/ingress.class: nginx #You may deploy any number of ingress controllers within a cluster. When you create an ingress,you should annotate each ingress with the appropriate ingress.class to indicate which ingress controller should be used if more than one exists within your cluster.
    #If you do not define a class,your cloud provider may use a default ingress controller.
    #nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    ##Following 2 lines are important,otherwise the SSL is terminated at the ingress level and the
    ## traffic sent to the service is plain http and then tomcat complains that the host and port combination
    ## needs https connection (in the tomcat server we have enabled the HTTPS internally)
    ## We want to forward the HTTPS traffic to the pods
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"

spec:
  #tls:
  #  - hosts:
  #      - yourhost.com
  rules:
    - host: yourhost.com
      http:
        paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: my-app-service
                port:
                  #number: 8080
                  number: 8443
,

请参阅文档 https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#ssl-passthrough

默认情况下禁用 SSL Passthrough,需要使用 --enable-ssl-passthrough 标志启动控制器。

因此,如果您想使用注解 nginx.ingress.kubernetes.io/ssl-passthrough,您需要使用 --enable-ssl-passthrough 标志启动 Nginx Ingress Controller

此外,由于 SSL Passthrough 在 OSI 模型 (TCP) 的第 4 层而不是第 7 层 (HTTP) 上工作,因此使用 SSL Passthrough 会使 Ingress 对象上设置的所有其他注释无效。

编辑:

如果您使用入口注释 nginx.ingress.kubernetes.io/ssl-passthrough 和 --enable-ssl-passthrough=true 标志作为入口控制器,那么 SSL 终止发生在您的 Tomcat 服务器 Pod。因此,您的客户端浏览器收到的 SSL 服务器证书就是您的 Tomcat SSL 服务器证书。在这种情况下,您的客户端浏览器必须信任 Tomcat SSL 服务器证书。此 SSL 直通发生在第 4 层 TCP,因此 NGINX 入口控制器不会解密来自客户端浏览器的 SSL 流量,它只是将其传递到 Tomcat 服务器 Pod。

如果您只是使用注解 nginx.ingress.kubernetes.io/backend-protocol: "HTTPS",那么第一个 SSL 终止将在您的入口控制器上发生。因此,您的客户端浏览器收到的 SSL 服务器证书是您的 Nginx 入口控制器 SSL 服务器证书,您的客户端浏览器必须信任它。然后从 Nginx Ingress Controller 到 Tomcat Pod 的通信使用另一个 SSL 加密。在这种情况下,您的 Nginx 入口控制器必须信任 Tomcat SSL 服务器证书,并且您拥有双重 SSL 加密和解密。

如果您使用注解 nginx.ingress.kubernetes.io/force-ssl-redirect: "true" 那么您的所有 http 请求都将使用 308 重定向 http 代码重定向到 https。你是在调用 http:// 还是 https:// ?

以下是代码和文档链接

https://github.com/kubernetes/ingress-nginx/blob/master/rootfs/etc/nginx/lua/lua_ingress.lua

https://github.com/openresty/lua-nginx-module

http://nginx.org/en/docs/http/ngx_http_proxy_module.html

当您在入口资源中进行更改时,检查 /etc/nginx/nginx.conf 在 nginx 控制器 pod 中的变化情况

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。