Caddy 搭配 Cloudflare CDN 时遇到了 TLS 证书申请问题,感觉有必要单独写一篇关于 Caddy 与 Cloudflare 搭配的文章,同时介绍一下 Cloudflare CDN 的使用。本文方法只适用于 Caddy2。
#前序工作
申请一个 Cloudflare 帐号,添加网站,把域名解析的服务器设置为 Cloudflare 提供给你的那两个,Cloudflare 会自动搜索子域名,如果不全自己补充。确定你要走 CDN 的网址被代理,即连接通过橙色的云。
#问题
Cloudflare CDN 加速网站时,允许 4 种加密模式,由下图所示,越严格越安全。我希望源站也能开启 Https。
Caddy 默认通过 Let’s Encrypt 获得 TLS 证书[1], 90 天有效期,并且会在上一次顺利申请证书 60 天后尝试更新。但是如果我们套上 CDN ,域名指向 CDN 提供的 CNAME,就不能通过默认方法申请 TLS 证书了。
那么有什么方法能继续在源站申请证书呢?
#方法
有 4 种方法,由简单到复杂,逐一介绍。
#1. 使用自签名证书
在 Caddy 配置文件中设置自签名,这样可以开启到 Full,但是直连源站不能开启 Https,因为自签名证书不被浏览器信任。
#2. 手动更新
证书快到期时临时撤下 CDN,更新证书,然后重新代理网站。可以开启到 Full (strict) 简单却麻烦。
当然也可以购买其他长期的证书,多付一些钱。
#3. 使用 Cloudflare 签发的证书
长效,免费,受 Cloudflare 认可,可以开启到 Full(strict),但是直连源站不能开启 Https,证书不被浏览器信任。
#4. 继续使 Caddy 向 Let‘s Encrypt 申请证书
合理的方法,也是本文主要写的方法。
ACME 有 3 中验证方式(ACME challenges: HTTP challenge, TLS-ALPN challenge, DNS challenge)。Caddy 默认使用前两种,这里我们要使用第三种。
官方教程在这里。
需要 Caddy 有一个额外的模块, dns.providers.cloudflare
。可以下载官方编译的,也可以用 xcaddy 编译。我直接下载了官方编译的,传到服务器上。
-
下载地址:https://caddyserver.com/download,记得勾选
dns.providers.cloudflare
模块。 -
或者,自行编译:
build xcaddy
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
build caddy
xcaddy build --with github.com/caddy-dns/cloudflare
我下载的 Caddy 可执行文件名字叫 caddy_linux_amd64_custom
,给它可执行权限,试运行,看看有没有我们需要的模块。
chmod +x caddy_linux_amd64_custom
./caddy_linux_amd64_custom list-modules | grep dns
如果正常,会显示出dns.providers.cloudflare
模块。
用自行编译/下载的 Caddy,替换原来的 Caddy, Caddy 一般安装在 /usr/bin/
,
用which caddy
这条命令来查找实际位置。
替换 Caddy
sudo mv caddy_linux_amd64_custom /usr/bin/caddy
建议先安装原版 Caddy 再替换,否则还要写一个 systemd service 文件。每次更新系统时,如果 Caddy 也更新了,要再次替换。
然后,要修改 Caddy 配置,下面两种方法选择一种,建议每个网站独自设置,更灵活,获取 Token 的方法下面介绍。
- 全局选项(对所有网站使用 DNS challenge)
在 Caddyfile 最上边加入
{
acme_dns cloudflare 3jd7w_Awe5ybpqG6zxXr6nRT&ywQyR_EfQtKoRe(你的API token)
}
- 每个网站独自设置
在每个网站的配置里,加入
tls {
dns cloudflare 3jd7w_Awe5ybpqG6zxXr6nRT&ywQyR_EfQtKoRe(你的API token)
}
一个例子:
#获得 Cloudflare API token
在 Cloudfalre 网站打开 Dashboard,找到 API 选项,https://dash.cloudflare.com/profile/api-tokens,新建 API TOKEN,如模块作者写的那样设置。
我新建了一个这样的 Token 作为参考。
记得保存好你的 Token 字符串,它只会显示一次。我申请了几个 Token,格式并不统一。
#测试
在 Cloudflare 的 DNS 管理页面下新添加一个子域名,并选择路由模式,在 Caddyfile 配置文件中增加对应的网站。停止 Caddy 服务,然后手动运行 Caddy ,看看是否能正常申请到证书。
sudo caddy run -config /etc/caddy/Caddyfile
成功申请。