Tengo una aplicación Java ejecutándose dentro del servidor tomcat (que está dentro de un pod), que está configurado para funcionar con https. Estoy usando el ingreso de nginx. El problema es que el ingreso de nginx está terminando el SSL y reenviando solo http simple al servidor tomcat (al pod en realidad). Dado que el servidor tomcat está configurado para funcionar solo con HTTPS, no acepta el tráfico.
Lo siguiente no funciona:
nginx.ingress.kubernetes.io/ssl-passthrough: "true"Finalmente he encontrado la respuesta:
Tengo que agregar las siguientes 2 líneas:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/force-ssl-redirect: "true"Entonces, el ingreso es así (también he agregado algunos comentarios para describir y también para mostrar qué opciones probé y no funcionaron, para que no pierda su tiempo):
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: 8443Consulte la documentación https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#ssl-passthrough
SSL Passthrough está deshabilitado de forma predeterminada y requiere iniciar el controlador con el indicador --enable-ssl-passthrough.
Por lo tanto, debe iniciar su controlador de entrada Nginx con el indicador --enable-ssl-passthrough si desea utilizar la anotación nginx.ingress.kubernetes.io/ssl-passthrough
Además, dado que SSL Passthrough funciona en la capa 4 del modelo OSI (TCP) y no en la capa 7 (HTTP), el uso de SSL Passthrough invalida todas las demás anotaciones establecidas en un objeto Ingress.
EDITAR :
Si utiliza la anotación de ingreso nginx.ingress.kubernetes.io/ssl-passthrough con el indicador --enable-ssl-passthrough=true para el controlador de ingreso, entonces la terminación SSL se está produciendo en su Tomcat Server Pod. Por lo tanto, el certificado de servidor SSL recibido por el navegador de su cliente es su certificado de servidor SSL de Tomcat. En este caso, el navegador de su cliente deberá confiar en el certificado del servidor SSL de Tomcat. Este SSL Passthrough está ocurriendo en la capa 4 TCP, por lo que el controlador de entrada NGINX no está descifrando el tráfico SSL del navegador del cliente, solo lo está pasando al pod del servidor Tomcat.
Si solo usa la anotación nginx.ingress.kubernetes.io/backend-protocol: "HTTPS", entonces la primera terminación de SSL está ocurriendo en su controlador de ingreso. Por lo tanto, el certificado de servidor SSL recibido por su navegador cliente es su certificado de servidor SSL de Nginx Ingress Controller y su navegador cliente tendrá que confiar en él. Y luego, la comunicación del controlador de ingreso de Nginx al Tomcat Pod usa otro cifrado SSL. En este caso, su controlador de entrada Nginx tendrá que confiar en el certificado del servidor SSL de Tomcat y tendrá doble cifrado y descifrado SSL.
Si usa la anotación nginx.ingress.kubernetes.io/force-ssl-redirect: "true", todas sus solicitudes de http se redireccionan a https mediante el código de redirección 308 de http. ¿Estás llamando a http:// o https://?
A continuación se muestran los enlaces de código y documentación
https://github.com/kubernetes/ingress-nginx/blob/master/rootfs/etc/nginx/lua/lua_ingress.lua
https://github.com/openresty/lua-nginx-módulo
http://nginx.org/en/docs/http/ngx_http_proxy_module.html
Verifique cómo cambia /etc/nginx/nginx.conf dentro del módulo del controlador nginx cuando realiza cambios en el recurso de ingreso