You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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注解和路径:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    
    同时将path改为/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 14:12:42