You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置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>/路径下,所以这里的路径对应你创建的api Secret。

第二步:更新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标签

第四步:验证配置是否生效

  1. 模拟无客户端证书的请求,应该被拒绝:
curl -v https://your-domain.com

会返回400 Bad Request,日志提示No required SSL certificate was sent

  1. 用API Gateway的客户端证书请求,应该正常返回业务响应:
curl -v --cert api-gateway-client-certificate.crt https://your-domain.com
  1. 查看Ingress Nginx日志确认验证通过:
kubectl logs -n ingress deployment/ingress-nginx-controller | grep "client certificate verified"

内容的提问来源于stack exchange,提问作者J. Doe

火山引擎 最新活动