如何使用Cookiecutter-django解决ACME证书挑战中的“连接被拒绝”错误

时间:2019-03-29 22:11:39

标签: docker digital-ocean lets-encrypt traefik cookiecutter-django

我使用cookiecutter-django(使用今天克隆的最新母版)创建了一个简单的网站。在本地运行docker-compose安装程序有效。现在,我想在数字海洋上部署该站点。为此,我运行以下命令:

$ docker-machine create -d digitalocean --digitalocean-access-token=secret instancename

$ eval "$(docker-machine env instancename)"

$ sudo docker-compose -f production.yml build

$ sudo docker-compose -f production.yml up

在cookiecutter-django documentation中,我阅读

  

如果您未使用项目中设置的域名的子域,则在部署网站之前,请记住将暂存/生产IP地址放入DJANGO_ALLOWED_HOSTS环境变量中(请参阅“设置”)。否则,将意味着您将无法通过HTTP协议访问您的网站。

因此,在文件.envs/.production/.django中,我将DJANGO_ALLOWED_HOSTS的行更改为

DJANGO_ALLOWED_HOSTS=.example.com(而不是example.com我使用我的实际域)

DJANGO_ALLOWED_HOSTS=XXX.XXX.XXX.XX (其中XXX.XXX.XXX.XX是我的数字海洋飞沫的IP;我也尝试了DJANGO_ALLOWED_HOSTS=.example.comDJANGO_ALLOWED_HOSTS=.example.com,XXX.XXX.XXX.XX,但结果相同)

此外,我登录到了注册域的位置,并确保将A记录指向我的数字海洋飞沫的IP。

使用此设置,部署将无法进行。我收到以下错误消息:

  

traefik_1 | time =“ 2019-03-29T21:32:20Z” level = error msg =“由于规则\” Host:example.com \“无法检测到\ example.com \域的ACME证书:无法生成域[example.com]的证书:acme:错误->一个或多个域出现问题:\ n [example.com] acme:错误:400 :: urn:ietf:params:acme:error:connection: :获取http://example.com/.well-known/acme-challenge/example-key-here:连接被拒绝,网址:\ n“

很遗憾,我无法找到此问题的解决方案。任何帮助将不胜感激!

更新

当我按照注释中的建议在服务器上运行netstat -antp时,我得到以下输出(用占位符代替IP):

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1590/sshd       
tcp        0      0 XXX.XXX.XXX.XX:22       YYY.YY.Y.YYY:48923      SYN_RECV    -               
tcp        0    332 XXX.XXX.XXX.XX:22       ZZ.ZZZ.ZZ.ZZZ:49726     ESTABLISHED 16959/0         
tcp        0      1 XXX.XXX.XXX.XX:22       YYY.YY.Y.YYY:17195      FIN_WAIT1   -               
tcp        0      0 XXX.XXX.XXX.XX:22       YYY.YY.Y.YYY:57909      ESTABLISHED 16958/sshd: [accept
tcp6       0      0 :::2376                 :::*                    LISTEN      5120/dockerd    
tcp6       0      0 :::22                   :::*                    LISTEN      1590/sshd

当我之前运行$ sudo docker-compose -f production.yml up时,netstat -antp返回以下内容:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1590/sshd       
tcp        0    332 XXX.XXX.XXX.XX:22       ZZ.ZZZ.ZZ.ZZZ:49726     ESTABLISHED 16959/0         
tcp        0      0 XXX.XXX.XXX.XX:22       AA.AAA.AAA.A:50098      ESTABLISHED 17046/sshd: [accept
tcp        0      0 XXX.XXX.XXX.XX:22       YYY.YY.Y.YYY:55652      SYN_RECV    -               
tcp        0      0 XXX.XXX.XXX.XX:22       YYY.YY.Y.YYY:16750      SYN_RECV    -               
tcp        0      0 XXX.XXX.XXX.XX:22       YYY.YY.Y.YYY:31541      SYN_RECV    -               
tcp        0      1 XXX.XXX.XXX.XX:22       YYY.YY.Y.YYY:57909      FIN_WAIT1   -               
tcp6       0      0 :::2376                 :::*                    LISTEN      5120/dockerd    
tcp6       0      0 :::22                   :::*                    LISTEN      1590/sshd  

1 个答案:

答案 0 :(得分:1)

根据我的经验,Droplet由cookiecutter-django根据需要进行配置,端口已正确打开,因此,除非您将其关闭,否则您无需执行任何操作。

通常,当发生此错误时,是由于DNS配置问题所致。基本上,“让我们加密”无法使用域example.com访问您的服务器。不幸的是,您没有给我们您所使用的实际域名,所以我将尽力猜测。

您说您已经配置了A记录以指向液滴,这是您应该执行的操作。但是,此配置需要在大多数名称服务器上传播,这可能需要一些时间。它可能会为您传播,但是如果不使用Let's Encrypt使用的名称服务器,则您的TLS证书将失败。

您可以使用在线工具检查其传播情况,该工具可以一次检查多个名称服务器,例如https://dnschecker.org/

您可以在计算机上使用dig进行操作(对于有兴趣的人,我建议this video):

# Using your default name server
dig example.com

# Using 1.1.1.1 as name server
dig @1.1.1.1 example.com

希望有帮助。