具有letencrypt的nginx入口:正在等待http-01挑战传播:错误的状态码“ 404”,预期为“ 200”

时间:2020-03-20 00:28:15

标签: nginx kubernetes lets-encrypt kubernetes-ingress nginx-ingress

我正试图从GKE重新部署到Digital Ocean。我遇到了letencrypt提出的挑战问题。我相信K8s告诉我找不到路线。 letencrypt尝试进行挑战但失败的两个主机名/域是SendGrid使用的CNAMES。我不太确定从哪里开始进行问题排查,我的google-fu让我失败了。

Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  acme.cert-manager.io/v1alpha2
Kind:         Challenge
Metadata:
  Creation Timestamp:  2020-03-19T20:34:04Z
  Finalizers:
    finalizer.acme.cert-manager.io
  Generation:  1
  Owner References:
    API Version:           acme.cert-manager.io/v1alpha2
    Block Owner Deletion:  true
    Controller:            true
    Kind:                  Order
    Name:                  letsencrypt-certs-80407504-346698183
    UID:                   84ab9399-3a61-462e-a1c5-0831bd451a36
  Resource Version:        37060
  Self Link:               /apis/acme.cert-manager.io/v1alpha2/namespaces/default/challenges/letsencrypt-certs-80407504-346698183-813483524
  UID:                     ca14d996-3ecf-4dd8-8c53-057af7ae2b27
Spec:
  Authz URL:  https://acme-v02.api.letsencrypt.org/acme/authz-v3/3449670327
  Dns Name:   7502121.secodify.com
  Issuer Ref:
    Group:  cert-manager.io
    Kind:   ClusterIssuer
    Name:   letsencrypt-prod
  Key:      LiAawBR0bFRQfb2oXrvvNhph3ehQ-35lXJKkpjqgqb0.uWH4RnJfcABYba9T5b-QjoYnIw53rRtVhzsRIHIh39Y
  Solver:
    http01:
      Ingress:
        Class:  nginx
  Token:        LiAawBR0bFRQfb2oXrvvNhph3ehQ-35lXJKkpjqgqb0
  Type:         http-01
  URL:          https://acme-v02.api.letsencrypt.org/acme/chall-v3/3449670327/JGayWw
  Wildcard:     false
Status:
  Presented:   true
  Processing:  true
  Reason:      Waiting for http-01 challenge propagation: wrong status code '404', expected '200'
  State:       pending
Events:        <none>

我的配置图如下:

--- 
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    events {
      worker_connections  1024;
    }
    http {
      server {
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
        listen 8080;
        server_name localhost;
        location ^~ /.well-known/acme-challenge/ {
          default_type "text/plain";
          rewrite /.well-known/acme-challenge/(.*) /$1 break;
        }
        location /static/ {
          autoindex on;    
          alias /code/core/static/; 
          include /etc/nginx/mime.types;
        }
        location = /favicon.ico {
        access_log off;
        log_not_found off;
        }
        location / {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_pass http://127.0.0.1:8080/;
        }
      }
    }
---```

3 个答案:

答案 0 :(得分:0)

在您的Ingress配置文件中添加certmanager.k8s.io/cluster-issuer批注。类似的问题:certmanager

此外,您在ConfigMap中服务器的位置定义中存在语法错误:

 location ^~ /.well-known/acme-challenge/

请记住,还要在您的Ingress配置文件中添加重写和nginx类注释。

答案 1 :(得分:0)

结果是,未使用CNAME。从配置中删除它们后,我将再次执行kubectl get challenges,但是它为空。我想这是因为挑战已经得到处理,因此没有待解决的问题。

我还有另一个问题,我忘了在kubernetes服务和部署吊舱之间建立联系。

在两个问题之间,我感到困惑。

答案 2 :(得分:0)

我在使用Traefik的K3S上遇到了相同的错误。原因是DNS和端口转发。 在联系Letsencrypt之前,Certmanager会进行自我测试。如果我将Nginx用作路由器,则会出现相同的错误。

我有:

  • Raspberry Pi
  • 运行Kubernetes
  • 在我的“ DMZ”中
  • 使用端口转发功能可以访问路由器上的端口80/443。

我在域提供商的DNS服务器中设置了几条A记录:

Certmanager调用我的路由器来测试它的Letsencrypt功能,而不是在Raspberry Pi上测试其自身。

通过将DNS记录添加到我的路由器的域的DNS服务器中来解决该问题,以便它们直接指向Raspberry Pi的内部IP地址。

当然:

  • 我的“ DMZ”应该更安全,并且Raspberry Pi无法访问路由器管理网站和内部网络。
  • 除更新外,我的Raspbery Pi应该无法启动与互联网的连接。