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

如何在Nginx Ingress Controller中为特定路径启用客户端证书验证?

基于路径的客户端证书验证实现方案(Kubernetes Ingress)

方案一:复用现有Nginx Ingress Controller,通过自定义配置实现路径级验证

Nginx Ingress Controller的全局注解无法实现路径级验证,但可以通过nginx.ingress.kubernetes.io/configuration-snippet注解,为特定路径插入Nginx原生配置规则,实现精准控制。

实现步骤:

  1. 准备客户端证书CA文件,创建Secret存储(若已存在可跳过):
kubectl create secret generic client-ca-secret --from-file=ca.crt=./your-ca-cert.pem -n your-namespace
  1. 创建两个Ingress资源,对应不同路径:
  • 针对/auth路径的Ingress,添加自定义配置启用客户端证书验证
  • 针对/tool路径的Ingress,不添加验证配置

示例YAML:

# auth路径的Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-auth-ingress
  namespace: your-namespace
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      ssl_verify_client on;
      ssl_client_certificate /etc/nginx/ssl/client-ca-secret/ca.crt;
      ssl_verify_depth 2;
spec:
  tls:
  - hosts:
    - app.example.com
    secretName: your-tls-secret # 域名对应的SSL证书Secret
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /auth
        pathType: Prefix
        backend:
          service:
            name: your-auth-service
            port:
              number: 80

# tool路径的Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-tool-ingress
  namespace: your-namespace
spec:
  tls:
  - hosts:
    - app.example.com
    secretName: your-tls-secret
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /tool
        pathType: Prefix
        backend:
          service:
            name: your-tool-service
            port:
              number: 80

说明:

  • Nginx Ingress会自动合并同域名的Ingress规则,生成对应的location块
  • configuration-snippet中的配置会直接插入到/auth路径对应的location块中,实现仅该路径验证客户端证书
  • 需确保客户端CA Secret已挂载到Ingress Controller Pod中(默认挂载路径为/etc/nginx/ssl/<secret-name>/)

方案二:切换到Traefik Ingress Controller(原生支持路径级验证)

Traefik支持在路由级别配置客户端证书验证,无需自定义配置,更简洁。

实现步骤:

  1. 部署Traefik Ingress Controller(完成官方标准安装即可)
  2. 创建TLS Options资源,定义客户端证书验证规则:
apiVersion: traefik.containo.us/v1alpha1
kind: TLSOption
metadata:
  name: client-cert-verify
  namespace: your-namespace
spec:
  clientAuth:
    secretNames:
      - client-ca-secret # 存储客户端CA证书的Secret
    clientAuthType: RequireAndVerifyClientCert
  1. 创建IngressRoute资源,为不同路径绑定不同TLS规则:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: app-ingressroute
  namespace: your-namespace
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`app.example.com`) && PathPrefix(`/auth`)
      kind: Rule
      services:
        - name: your-auth-service
          port: 80
      tls:
        options:
          name: client-cert-verify # 启用客户端证书验证
    - match: Host(`app.example.com`) && PathPrefix(`/tool`)
      kind: Rule
      services:
        - name: your-tool-service
          port: 80
  tls:
    secretName: your-tls-secret # 域名SSL证书Secret

说明:

  • /auth路径通过tls.options绑定了客户端证书验证规则,/tool路径不配置该选项,自然跳过验证
  • Traefik会自动处理路由匹配和TLS规则应用,无需额外自定义配置

内容的提问来源于stack exchange,提问作者Karan Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:03:10