如何在K8s上用Let's Encrypt Cluster-Issuer配置Spring Cloud Gateway SSL
Spring Cloud Gateway 结合 Cert-Manager 与 Let's Encrypt 配置指南
问题定位
你的配置存在两个关键问题:
- 默认认证过滤器拦截ACME挑战:网关的
TokenRelay、SaveSession等默认过滤器会作用于所有请求,包括Let's Encrypt的HTTP-01挑战请求,导致挑战因缺少认证令牌被拦截失败。 - 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
相关产品推荐
相关产品推荐

