如何在Nginx Ingress Controller中为特定路径启用客户端证书验证?
基于路径的客户端证书验证实现方案(Kubernetes Ingress)
方案一:复用现有Nginx Ingress Controller,通过自定义配置实现路径级验证
Nginx Ingress Controller的全局注解无法实现路径级验证,但可以通过nginx.ingress.kubernetes.io/configuration-snippet注解,为特定路径插入Nginx原生配置规则,实现精准控制。
实现步骤:
- 准备客户端证书CA文件,创建Secret存储(若已存在可跳过):
kubectl create secret generic client-ca-secret --from-file=ca.crt=./your-ca-cert.pem -n your-namespace
- 创建两个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支持在路由级别配置客户端证书验证,无需自定义配置,更简洁。
实现步骤:
- 部署Traefik Ingress Controller(完成官方标准安装即可)
- 创建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
- 创建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
相关产品推荐
相关产品推荐

