CDN 加速网站,Caddy 与 Cloudflare 搭配使用,配置 TLS

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 编译。我直接下载了官方编译的,传到服务器上。

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 的方法下面介绍。

  1. 全局选项(对所有网站使用 DNS challenge)

在 Caddyfile 最上边加入

{
    acme_dns cloudflare 3jd7w_Awe5ybpqG6zxXr6nRT&ywQyR_EfQtKoRe(你的API token)
}
  1. 每个网站独自设置

在每个网站的配置里,加入

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

成功申请。