Kubernetes Ingress多后端服务特定上下文下站点不安全问题
问题描述
在单个Nginx Ingress Controller后端部署了多个服务,门户应用(可通过菜单跳转其他应用的Web门户)加载正常且显示安全,但打开部分后端应用时,新标签页显示不安全,同时原门户标签页也自动变为不安全状态。同一Tomcat容器上的多个应用中,部分无此问题,部分触发异常;打开多个正常应用后,再打开触发问题的应用,此前的正常标签页无需刷新也会变为不安全状态。Ingress域名的SSL证书有效,由基础设施团队管理。
应用运行在Rancher托管的容器化Tomcat中。
已尝试的无效方案
- 将后端服务从8080端口改为通过Java密钥库启用HTTPS的8443端口,同步调整K8s Service指向8443;
- 在Tomcat的
conf/context.xml中启用crossContext="true",尝试通过上下文共享解决问题。
Ingress Controller配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: 'abcd' namespace: 'dev1' annotations: appgw.ingress.kubernetes.io/backend-path-prefix: "/" nginx.ingress.kubernetes.io/backend-protocol: HTTPS nginx.ingress.kubernetes.io/ssl-redirect: 'true' labels: project: 'abcd' spec: ingressClassName: nginx rules: - host: somedomain.corp.intranet http: paths: - backend: service: name: portal-dev1 port: number: 8443 path: / pathType: ImplementationSpecific - backend: service: name: portal-dev1 port: number: 8443 path: /portal pathType: ImplementationSpecific - backend: service: name: cfml-dev1 port: number: 8443 path: /cfml pathType: ImplementationSpecific - backend: service: name: webapp1-dev1 port: number: 8443 path: /webappA pathType: ImplementationSpecific tls: - hosts: - somedomain.corp.intranet status: loadBalancer: ingress: - ip: someIpList
排查方向与解决建议
1. 定位混合内容问题
浏览器显示"不安全"核心原因是页面混入HTTP明文资源(图片、JS、CSS、接口请求等)。打开浏览器开发者工具(F12),查看「控制台」的Mixed Content报错,找到具体的HTTP资源URL。这些资源大概率是触发问题的应用硬编码了HTTP协议链接,或未使用相对路径/域名相对路径生成资源地址。
2. 配置Tomcat正确处理反向代理头部
Nginx Ingress会向后端传递X-Forwarded-Proto(告知用户使用的协议是HTTPS)、X-Forwarded-Host等头部,若Tomcat未正确解析这些头部,应用会生成HTTP链接而非HTTPS:
- 在Tomcat的
conf/server.xml中添加RemoteIpValve配置:<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/> - 确保应用代码使用
request.getRequestURL()这类基于请求上下文的方式生成链接,而非硬编码协议。
3. 调整Ingress路径重写规则
若Ingress的path配置与应用预期的上下文路径不匹配,会导致应用生成错误的资源链接:
- 检查异常应用的上下文路径,比如
webappA是否本身上下文为/,此时当前Ingress的path: /webappA配合backend-path-prefix: "/"会导致路径错乱。可修改Ingress注解和路径:
同时将path改为nginx.ingress.kubernetes.io/rewrite-target: /$2/webappA(/|$)(.*),确保路径重写符合应用预期。
4. 排查同一Tomcat下的应用差异
同一Tomcat中部分应用正常、部分异常,重点对比两类应用的配置和代码:
- 检查异常应用的
web.xml,是否存在强制HTTP的安全约束; - 查看异常应用的配置文件(properties/xml),是否硬编码了HTTP协议的域名/端口;
- 确认异常应用是否使用自定义URL生成逻辑,未适配反向代理后的HTTPS环境。
5. 验证Ingress与后端的SSL通信
尽管已设置nginx.ingress.kubernetes.io/backend-protocol: HTTPS,仍需确认:
- Tomcat 8443端口使用的证书是否被Ingress Controller信任(自签名证书需加入Ingress的信任池);
- 查看Ingress Controller日志,是否存在与异常后端的SSL握手错误,这类错误可能导致Ingress回退到HTTP传递请求,进而引发混合内容问题。
内容的提问来源于stack exchange,提问作者vick_4444
相关产品推荐
相关产品推荐

