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

如何在K8s上用Let's Encrypt Cluster-Issuer配置Spring Cloud Gateway SSL

Spring Cloud Gateway 结合 Cert-Manager 与 Let's Encrypt 配置指南

问题定位

你的配置存在两个关键问题:

  1. 默认认证过滤器拦截ACME挑战:网关的TokenRelay、SaveSession等默认过滤器会作用于所有请求,包括Let's Encrypt的HTTP-01挑战请求,导致挑战因缺少认证令牌被拦截失败。
  2. ACME挑战路由目标错误:你将挑战请求路由到cert-manager-webhook,但HTTP-01挑战的响应服务是cert-manager临时创建的专用服务,无需网关转发到webhook,核心是要让挑战请求绕过网关的认证拦截。

分步解决方案

1. 优先让Ingress直接处理ACME挑战

你使用了acme.cert-manager.io/http01-edit-in-place: "true"注解,理论上cert-manager会自动在你的Ingress资源中添加挑战路径的规则(优先级高于你的默认/路径),直接将挑战请求转发到它的临时服务,无需经过Spring Cloud Gateway。

验证配置是否生效

执行以下命令检查cert-manager是否成功修改了Ingress:

kubectl get ingress demo-bff -n demo-bff -o yaml

如果输出中包含类似以下的路径规则,说明注解生效,挑战请求不会经过网关,此时问题大概率出在DNS解析或网络连通性上:

paths:
- path: /.well-known/acme-challenge/xxxxxx
  pathType: Exact
  backend:
    service:
      name: cm-acme-http-solver-xxxxxx
      port:
        number: 8089

检查证书与挑战状态

如果Ingress规则未被修改,检查证书和挑战的详细状态以定位问题:

# 查看证书状态
kubectl get certificates -n demo-bff
kubectl describe certificate demo-bff-tls -n demo-bff

# 查看挑战详情
kubectl get challenges -n demo-bff
kubectl describe challenge <挑战名称> -n demo-bff

2. 调整网关配置,放行挑战请求

如果挑战请求确实会到达网关(比如Ingress规则未正确添加),需要修改网关配置,让ACME挑战路径绕过所有认证相关的默认过滤器:

方案一:添加专属路由跳过默认过滤器

spring:
  cloud:
    gateway:
      default-filters:
      - TokenRelay=
      - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
      - SaveSession
      routes:
      # 优先级最高的ACME挑战路由,跳过所有默认过滤器
      - id: letsencrypt-acme-challenge
        uri: http://bff-gateway.demo-bff.svc.cluster.local:8080
        predicates:
        - Path=/.well-known/acme-challenge/**
        filters:
        - DisableDefaultFilters=true  # 跳过TokenRelay、SaveSession等认证过滤器
        - StripPrefix=0

方案二:条件化启用默认过滤器

在默认过滤器中添加判断逻辑,仅对非ACME路径应用认证过滤器:

spring:
  cloud:
    gateway:
      default-filters:
      - name: TokenRelay
        args:
          enabled: "#{!request.getPath().startsWith('/.well-known/acme-challenge/')}"
      - name: SaveSession
        args:
          enabled: "#{!request.getPath().startsWith('/.well-known/acme-challenge/')}"
      - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
      # 无需额外路由,默认规则即可

3. 验证网络与DNS

  • 确认域名bff.demo.c4-soft.com已正确解析到Ingress Nginx的LoadBalancer IP(148.113.158.14)。
  • 确保80端口对外开放(HTTP-01挑战要求域名的80端口可被Let's Encrypt服务器访问)。

总结

  • 若http01-edit-in-place注解生效,Ingress会自动处理挑战请求,无需网关介入,重点排查Ingress规则、证书状态、DNS及网络。
  • 若挑战请求到达网关,通过调整路由或条件化过滤器让挑战请求绕过认证拦截即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:05:29