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

cwdobuhd  于 2022-11-13  发布在  Kubernetes
关注(0)|答案(2)|浏览(141)

我有一个Java应用程序运行在tomcat服务器(在pod中)中,它被配置为使用https。我使用的是nginx入口。问题是,nginx入口终止了SSL,并且只将普通http转发到tomcat服务器(实际上是转发到pod)。由于tomcat服务器被配置为只使用HTTPS,它不接受流量。
以下操作不起作用:

nginx.ingress.kubernetes.io/ssl-passthrough: "true"
bnlyeluc

bnlyeluc1#

终于我找到了答案:
我必须添加以下两行:

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
czfnxgou

czfnxgou2#

请参阅文档https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#ssl-passthrough
默认情况下,SSL通过处于禁用状态,并且需要使用--enable-ssl-passthrough标志启动控制器。
所以,如果你想使用注解www.example.com,你需要用--enable-ssl-passthrough标志来启动你的Nginx入口控制器nginx.ingress.kubernetes.io/ssl-passthrough
此外,由于SSL通过在OSI模型的第4层(TCP)上工作,而不是在第7层(HTTP)上工作,因此使用SSL通过会使在入口对象上设置的所有其他注解无效。
编辑:
如果您将入口注解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入口控制器到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中是如何更改的

相关问题