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

启用Istio Sidecar配置后RequestAuthentication验证失败

Istio Sidecar配置导致JWT认证失效问题排查

问题背景

本地运行部署了Istio的Kubernetes集群,分两个命名空间部署服务:

  • authserver:授权服务器,通过ClusterIP服务向集群内暴露
  • resourceserver:资源服务器,同样通过ClusterIP服务暴露

为资源服务器配置了Istio的认证与授权规则:

RequestAuthentication配置

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: resource-service-auth
  namespace: resourceserver
spec:
  selector:
    matchLabels:
      app: my-resource
  jwtRules:
    - issuer: "http://authorization-service.authserver"
      audiences:
        - "client"
      jwksUri: "http://authorization-service.authserver/oauth2/jwks"

AuthorizationPolicy配置

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: resource-service-authz
  namespace: resourceserver
spec:
  selector:
    matchLabels:
      app: my-resource
  action: DENY
  rules:
    - from:
        - source:
            notRequestPrincipals: ["*"]

原本上述配置可正常拦截无效JWT、放行有效JWT,但为资源服务器添加以下Sidecar配置后,使用有效JWT请求时出现认证错误:

Sidecar配置

apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
  name: resourceservice-sidecar
  namespace: resourceserver
spec:
  workloadSelector:
    labels:
      app: resourceservice
  egress:
    - hosts:
        - "authservice/*"
  outboundTrafficPolicy:
    mode: REGISTRY_ONLY

错误表现:

  • 默认配置下:返回Jwks doesn't have key to match kid or alg from Jwt
  • 修改PILOT_JWT_ENABLE_REMOTE_JWKS="envoy"后:返回Jwks remote fetch is failed

问题原因及修复方案

1. 核心问题:Sidecar出口规则配置错误

你的Sidecar配置中,egress.hosts设置为authservice/*,但授权服务器的服务所在命名空间是authserver,服务名是authorization-service,这个匹配规则完全错误,导致JWKS拉取路径被阻断:

  • 默认模式下,Istiod会替Sidecar拉取JWKS密钥,但REGISTRY_ONLY模式限制了集群内流量只能流向Sidecar规则允许的目标,因规则未放通authserver命名空间的服务,Istiod无法获取有效JWKS,只能返回空或无效的密钥集合,最终JWT校验失败。
  • 切换到envoy模式后,由Sidecar自身发起JWKS拉取请求,但同样因为出口规则未放通正确地址,请求被拦截,直接报拉取失败。

2. 修复Sidecar配置

修改egress.hosts为授权服务器所在的命名空间,或者直接指定具体服务地址:

方案一:放通整个authserver命名空间的服务

apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
  name: resourceservice-sidecar
  namespace: resourceserver
spec:
  workloadSelector:
    labels:
      app: resourceservice
  egress:
    - hosts:
        - "authserver/*"
  outboundTrafficPolicy:
    mode: REGISTRY_ONLY

方案二:指定具体服务地址

apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
  name: resourceservice-sidecar
  namespace: resourceserver
spec:
  workloadSelector:
    labels:
      app: resourceservice
  egress:
    - hosts:
        - "authorization-service.authserver.svc.cluster.local"
  outboundTrafficPolicy:
    mode: REGISTRY_ONLY

3. 额外校验点

  • 标签一致性:你的认证规则匹配的是app: my-resource,但Sidecar匹配的是app: resourceservice,确保资源服务器Pod的标签与这两个规则的标签一致,避免Sidecar未正确挂载到目标Pod上。
  • 服务连通性:修复Sidecar后,可在资源服务器Pod内部执行curl http://authorization-service.authserver/oauth2/jwks,确认能正常获取JWKS密钥内容。

内容的提问来源于stack exchange,提问作者Brian K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:05:20