【问题标题】:cert-manager HTTP01 certificate challenge is inaccessible when rewrite-target is enabled启用重写目标时,无法访问 cert-manager HTTP01 证书质询
【发布时间】:2022-06-16 20:04:04
【问题描述】:

我们在 GKE 中使用 ingress-nginx 控制器公开了十几个服务。

为了在同一个域名上正确路由流量,我们需要使用重写目标规则。

这些服务自 2019 年推出以来运行良好,没有进行任何维护,直到最近;当 cert-manager 突然停止更新 Let's Encrypt 证书时,我们通过暂时从入口定义中删除“tls”部分来“解决”这个问题,迫使我们的客户使用 http 版本。

之后,我们删除了 cert-manager 尝试从头开始设置它的所有痕迹。

现在,cert-manager 正在创建证书签名请求,生成一个 acme http 求解器 pod 并将其添加到入口,但是在访问其 url 时,我可以看到它返回一个空响应,而不是预期的令牌。

这与混淆了 acme 挑战的路由的 rewrite-target 注释有关。 最让我困惑的是,这曾经可以工作。 (它是由一位前雇员设置的)

不幸的是,禁用重写目标不是一个选项,因为它会阻止路由正常工作。

使用 dns01 不起作用,因为我们的 ISP 不支持以编程方式更改 DNS 记录。

有没有办法在不禁用重写目标的情况下完成这项工作?

附: 以下是 Github 上报道的一些类似案例:

它们都没有帮助。

这是我的 ClusterIssuer 的定义

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    # The ACME server URL
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: mail@domain.com
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-prod
    # Enable the HTTP-01 challenge provider
    solvers:
    - http01:
        ingress:
            class: nginx

【问题讨论】:

  • 你能确认这在没有重写目标的情况下有效吗? (可能在另一个环境中)
  • @ChenA。是的,禁用重写目标似乎有帮助。
  • 在下面查看我的答案。您可以尝试修改此特定入口上的 rewrite-targets 注释

标签: kubernetes google-kubernetes-engine cert-manager ingress-nginx


【解决方案1】:

请分享您正在使用的集群发行者或问题。

ingressClass

如果指定了 ingressClass 字段,cert-manager 将创建 新的 Ingress 资源,以便将流量路由到 acmesolver pods,负责响应ACME 质询验证请求。

参考:https://cert-manager.io/v0.12-docs/configuration/acme/http01/#ingressclass

大多数情况下,如果 DNS 或 HTTP 工作正常,我们不会看到 HTTP 求解器挑战并被移除。

此外,请确保您的入口没有 SSL 重定向注释,这也可能是 certs 未生成的原因。

您是否尝试检查 cert-manager 的其他对象,例如订单和证书状态请求? kubectl describe challenge 你得到 404 了吗?

如果您不断尝试,您可能会达到让我们加密请求生成证书的速率限制。

疑难解答:https://cert-manager.io/docs/faq/troubleshooting/#troubleshooting-a-failed-certificate-request

【讨论】:

  • 挑战返回空内容,这是因为它受到重写目标会话的影响。我已经用 ClusterIssuer 定义更新了我的问题。
  • 证书管理器 pod 日志中的任何内容?你在那里检查过吗?
  • 只有挑战没有返回预期的令牌,因为重写目标......
  • 得到它会检查并更新回来,如果它正在创建 acmeresolver,它应该比 rewrite 更有效
【解决方案2】:

当您使用http01 配置颁发者时,默认服务类型为NodePort。这意味着,它甚至不会通过入口控制器。来自docs

默认情况下,当您不设置 HTTP01 或将 serviceType 设置为空字符串时,将使用类型 NodePort。通常无需更改。

我不确定您的其余设置如何,但http01 导致 acme 服务器发出 HTTP 请求(不是 https)。您需要确保您的 nginx 具有 http (80) 的侦听器。它确实遵循重定向,因此您可以侦听 http 并将所有流量重定向到 https,这是合法且有效的。

证书管理器创建一个ingress 资源用于验证。它将流量引导到临时 pod。这个入口有它自己的一套规则,你可以使用这个setting来控制它。您可以尝试禁用或修改此资源上的重写目标。

我会尝试的另一件事是从集群内部访问此 URL(绕过入口 nginx)。如果它直接工作,那么它是一个入口/网络问题,否则它是别的东西。

请分享相关的 nginx 和 cert-manager 日志,它可能有助于调试或了解您的问题所在。

【讨论】:

    猜你喜欢
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2022-01-10
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多