带有证书管理器和 Nginx 入口的 404 质询响应

Posted

技术标签:

【中文标题】带有证书管理器和 Nginx 入口的 404 质询响应【英文标题】:404 challenge response with cert-manager and Nginx ingress 【发布时间】:2020-04-01 14:38:07 【问题描述】:

我正在尝试通过 this Helm 图表运行 letsencrypt/cert-manager。 K8s 集群在 Digital Ocean 上。

我按照建议成功安装了verified,并创建了一个ClusterIssuer 用于暂存,1 个用于生产。 (letsencrypt-staging, letsencrypt-prod)

问题:acme 质询返回 404 错误。

$ k get challenge -o wide
NAME                                                      STATE     DOMAIN                 REASON                                                                               AGE
myapp-cert-2315925673-2905389610-1118496475   pending   myapp.example.com   Waiting for http-01 challenge propagation: wrong status code '404', expected '200'   7m55s

tls 块被注释掉时,Ingress 可以在端口 80 上正常工作。但是,当我定义 tls 时,端口 80 上的请求返回 404,这可能是挑战失败的原因。

注意:使用我的产品ClusterIssuer 时,我得到了相同的响应。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-staging
  labels:
    app: myapp
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - backend:
          serviceName: myapp
          servicePort: 80
  tls:
  - hosts:
    - myapp.example.com
    secretName: myapp-cert

:: 编辑以添加更多配置 ::

按照@Tubc 的要求添加更多配置和日志后,由于证书不存在,当我更新入口时,Nginx 似乎会抛出错误。

ClusterIssuer 清单:

---
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: me@example.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx
---
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    email: me@example.com
    privateKeySecretRef:
      name: letsencrypt-staging
    solvers:
    - http01:
        ingress:
          class: nginx

服务清单:

---
apiVersion: v1
kind: Service
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  ports:
    - port: 80
  selector:
    app: myapp
    tier: fe
  type: NodePort

Nginx 日志:

2019/12/08 14:45:44 [emerg] 62#62:无法加载证书“/etc/nginx/secrets/default-myapp-cert”:PEM_read_bio_X509_AUX() 失败(SSL:错误:0909006C:PEM例程:get_name:无起始行:期望:可信证书) I1208 14:45:44.934644 1 event.go:209] Event(v1.ObjectReferenceKind:"Ingress", Namespace:"default", Name:"myapp-ingress", UID:"610c3304-0565-415d-8cde- 0863bf9325ca", APIVersion:"extensions/v1beta1", ResourceVersion:"319124", FieldPath:""): type: 'Warning' reason: 'AddedOrUpdatedWithError' 默认/myapp-ingress 的配置已添加或更新,但未应用:为默认/myapp-ingress 重新加载 NGINX 时出错:nginx 重新加载失败:命令 /usr/sbin/nginx -s reload stdout: "" 标准错误:“nginx:[emerg] 无法加载证书\“/etc/nginx/secrets/default-myapp-cert\”:PEM_read_bio_X509_AUX() 失败(SSL:错误:0909006C:PEM 例程:get_name:无起始行:预期:受信任的证书)\n" 以错误结束:退出状态 1

【问题讨论】:

您能提供更多信息吗? nginx 日志、证书/颁发者清单 应用程序是否有“/”路由?如果没有,这可能是您获得 404 的原因。 @Tubc 我添加了配置和日志。 Nginx 显示与证书不存在有关的错误,我想这是预期的。只是不确定这是否会阻止它在端口 80 上提供服务,因此可以读取挑战。 @debarshi 路径默认为 /。但是,我确实只是在定义了路径的情况下运行了一个测试,但并没有什么不同。 对于那些使用 Traefik 的人,这里有一个类似的问题:***.com/questions/58284860/… 【参考方案1】:

尽管复制了文档,但事实证明 Ingress 上的注释键是错误的。

应该是:certmanager.k8s.io/cluster-issuer(而不是文档中的cert-manager.io/cluster-issuer

进行此更改后,404 消失,证书已正确颁发和配置。

【讨论】:

certmanager.k8s.io/cluster-issuer 已弃用,并且在最新版本中未使用。您的发行人正在使用 nginx 类,因此它将为挑战创建新的入口。我认为您可以删除注释 我认为您正在运行证书管理器的旧实例。当我尝试这个时,我的证书管理器不会对注释做出反应。

以上是关于带有证书管理器和 Nginx 入口的 404 质询响应的主要内容,如果未能解决你的问题,请参考以下文章

Nginx Ingress 给 404 未找到任何入口资源

Nginx 入口控制器返回 404 Kubernetes

在入口 nginx 中启用 tls 时没有“Access-Control-Allow-Origin”

Kubernetes NGINX 入口控制器未获取 TLS 证书

带有质询的 Webhook URL 验证

解决局域网内开发https请求的证书问题