现象

Caddy作为一个简单轻便的网站服务端环境,本来用的好好的,突然有一天发现 44380 端口不在了,网站无法访问,反向代理功能不正常……查看caddy日志有如下提示:

1
too many registrations for this IP

或者伴随这样的提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
caddy.service - Caddy HTTP/2 web server
Loaded: loaded (/usr/lib/systemd/system/caddy.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Sat 2019-10-12 06:30:22 CST; 4h 10min ago
Docs: https://caddyserver.com/docs
Process: 758 ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp (code=exited, status=1/FAILURE)
Main PID: 758 (code=exited, status=1/FAILURE)

Oct 12 06:30:11 caddy[758]: 2019/10/12 06:30:11 [INFO] [x.y.com] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz-v3/736450281
Oct 12 06:30:11 caddy[758]: 2019/10/12 06:30:11 [INFO] [x.y.com] acme: use tls-alpn-01 solver
Oct 12 06:30:11 caddy[758]: 2019/10/12 06:30:11 [INFO] [x.y.com] acme: Trying to solve TLS-ALPN-01
Oct 12 06:30:11 caddy[758]: 2019/10/12 06:30:11 [INFO] Unable to deactivated authorizations: https://acme-v02.api.letsencrypt.org/acme/authz-v3/736450281
Oct 12 06:30:11 caddy[758]: 2019/10/12 06:30:11 [ERROR] Renewing [x.y.com]: acme: Error -> One or more domains had a problem:
Oct 12 06:30:11 caddy[758]: [x.y.com] acme: error: 403 :: urn:ietf:params:acme:error:unauthorized :: Cannot negotiate ALPN protocol "acme-tls/1" for tls-alpn-01 challenge, url:
Oct 12 06:30:11 caddy[758]: ; trying again in 10s
Oct 12 06:30:22 systemd[1]: caddy.service: main process exited, code=exited, status=1/FAILURE
Oct 12 06:30:22 systemd[1]: Unit caddy.service entered failed state.
Oct 12 06:30:22 systemd[1]: caddy.service failed.

可能原因

一般Caddy会自动通过acme申请证书,可突然就提示没授权,也不知道具体问题在哪。因为某些网站可以正常申请,某些却不行,可能跟服务器IP有关,也有可能跟网站解析有关。

解决办法

更换域名

因为申请失败的原因各异,如果出现自动签发证书失败,考虑下域名解析是不是错了,是不是被和谐掉了,先换个域名试下是不是就成功了?如果成功,那后面的事情就不用做了,能解决谁还想多折腾不是?

使用手动申请证书

自己手动从证书发行方申请证书,然后在Caddy配置中指定证书文件和秘钥对:

1
tls cert key

  • cert:证书文件。如果证书是由CA签署的,那么这个证书文件应该是一个包:服务器证书后面跟着CA证书(根证书通常不是必须的)。
  • key:与证书文件匹配的服务器私钥文件。 指定您自己的证书和密钥将禁用自动HTTPS,包括更改端口和将HTTP重定向到HTTPS。如果你正在管理自己的证书,那这些需要你自己去做。

使用自签名

1
tls self_signed

上面的语法将使用Caddy的默认TLS设置,Caddy生成并在内存中使用一个不可信的自签名证书,该证书持续7天,所以它一般仅用于本地开发。

关闭TLS

由于申请CA证书失败,Caddy就直接退出了,如果对TLS没要求,可以关闭TLS,通过以下语法配置:

1
tls off

禁用网站的TLS。除非你有充分的理由,否则不要推荐。关闭TLS后,自动HTTPS会被禁用,且启用默认端口(2015),所以需要指定端口启动Caddy:

1
/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp -port=80

参考文档

https://github.com/caddyserver/caddy/wiki/v2:-Caddyfile-examples

https://dengxiaolong.com/caddy/zh/tls.html