如何配置Ingress Nginx通过AWS API Gateway客户端证书限制流量来源?
没问题,我帮你把整个配置流程梳理清楚,确保你的Ingress Nginx只接受来自AWS API Gateway的流量——结合你已经创建的客户端证书Secret,搭配Ingress Controller和AWS经典ELB的配置来实现:
实现Ingress Nginx仅放行AWS API Gateway流量(客户端证书验证)
第一步:配置Ingress Nginx Controller的ConfigMap启用证书验证
首先需要让Ingress Nginx知道要信任的客户端CA证书,修改Controller的ConfigMap来全局启用客户端证书验证:
apiVersion: v1 kind: ConfigMap metadata: name: ingress-nginx-controller namespace: ingress data: # 指向你创建的Secret在容器内的挂载路径 ssl-client-certificate: "/etc/ingress-nginx/ssl/api/api-gateway-client-certificate.crt" # 强制验证客户端证书,无有效证书则拒绝请求 ssl-verify-client: "on" # 证书链验证深度,设为1足够匹配API Gateway的直接证书 ssl-verify-depth: "1"
注:Ingress Nginx会自动把
ingress命名空间下的Secret挂载到/etc/ingress-nginx/ssl/<secret-name>/路径下,所以这里的路径对应你创建的apiSecret。
第二步:更新Ingress资源配置(确保TLS与验证生效)
如果你的业务Ingress已经配置了TLS,只需要确保服务端证书正常,客户端验证会通过全局ConfigMap生效。如果需要针对特定Ingress单独配置验证规则,可以用注解覆盖全局:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: your-app-ingress namespace: your-app-namespace annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" # 可选:针对当前Ingress单独配置验证(无需全局ConfigMap) # nginx.ingress.kubernetes.io/auth-tls-secret: "ingress/api" # nginx.ingress.kubernetes.io/auth-tls-verify-client: "on" # nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1" spec: ingressClassName: nginx tls: - hosts: - your-domain.com secretName: your-server-tls-secret # 你的服务端HTTPS证书Secret rules: - host: your-domain.com http: paths: - path: / pathType: Prefix backend: service: name: your-app-service port: number: 80
第三步:完善AWS经典ELB类型的Ingress Service配置
因为你的Ingress Service是TCP类型的经典ELB,需要确保ELB不终止SSL,直接转发流量到Ingress Nginx,这样才能传递客户端证书:
kind: Service apiVersion: v1 metadata: name: ingress-nginx namespace: ingress labels: app: ingress-nginx annotations: # 指定为AWS经典ELB类型 service.beta.kubernetes.io/aws-load-balancer-type: "classic" # 设为true则创建内部ELB,根据你的需求调整 service.beta.kubernetes.io/aws-load-balancer-internal: "false" # 后端用TCP协议转发,不终止SSL service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "tcp" # 标记443为SSL端口,让ELB正确处理流量 service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443" spec: type: LoadBalancer ports: - name: https port: 443 targetPort: 443 protocol: TCP selector: app: ingress-nginx # 匹配你的Ingress Controller Pod标签
第四步:验证配置是否生效
- 模拟无客户端证书的请求,应该被拒绝:
curl -v https://your-domain.com
会返回400 Bad Request,日志提示No required SSL certificate was sent。
- 用API Gateway的客户端证书请求,应该正常返回业务响应:
curl -v --cert api-gateway-client-certificate.crt https://your-domain.com
- 查看Ingress Nginx日志确认验证通过:
kubectl logs -n ingress deployment/ingress-nginx-controller | grep "client certificate verified"
内容的提问来源于stack exchange,提问作者J. Doe




