在使用 Cloudflare 的网站上,签发 Let’s Encrypt 证书的问题

[ Browse English version of this post. ]

最近对一个网站启用了Cloudflare CDN之后,起初一切顺利,不过在某天准备使用以往一直使用的 acme_tiny.py 进行Let’s Encrypt证书续签的时候出错。之前没有使用CDN的时候,一直是定期使用这个程序进行证书签发,然而这回却失败了,尝试数次均卡在 cannot download http://****/.well-known/acme-challenge/**** . 这个错误上。

简而言之就是,在证书签发之前,这个程序会在待签发的域名下的一个指定路径,临时生成一个challenge文件,然后签发方(Let’s Encrypt)尝试下载这个文件,用于验证请求者是否是域名所有人。

尝试直接用 wget 下载这个文件,最后是404错误。看了详细经过可以发现,在尝试通过http方式下载challenge文件的时候,被直接重定向到了https,因此产生了问题。由于源服务器仅在80端口配置了acme-challenge,所以当从https访问的时候就得到了404错误。

因为之前一直是OK的,所以这次想会不会是CDN的原因造成了这个错误。

而且源服务器端并未在这个acme-challenge路径上配置https rewrite,那么究竟是为什么访问会被自动重定向到https呢?经过一番调查,尝试了Cloudflare中的数个选项,发现原来是 SSL/TLS –> Edge Certificates下面的 “Always Use HTTPS”这个选项的关系。当打开了这个后,会直接重定向全部http请求到https。这就是为什么会造成acme-challenge被重定向的原因。

当关闭了这个选项后,通过acme_tiny.py签发Let’s Encrypt证书便可如同往常一样正常进行。

这回的总结就是,当网站使用了CDN之后,可能会因为CDN配置的关系,导致一些意想不到的问题发生。当源服务器配置并不是造成问题的原因后,就应转向调查CDN的配置是否是造成问题的原因。

SSL/TLS -> Edge Certificates: always use HTTPS.

Leave a Reply

Your email address will not be published. Required fields are marked *