编辑
2024-11-23
挨踢
00
请注意,本文编写于 378 天前,最后修改于 265 天前,其中某些信息可能已经过时。

目录

前序工作
问题
方法
1. 使用自签名证书
2. 手动更新
3. 使用 Cloudflare 签发的证书
4. 继续使 Caddy 向 Let‘s Encrypt 申请证书
测试

Caddy 搭配 Cloudflare CDN 时遇到了 TLS 证书申请问题,感觉有必要单独写一篇关于 Caddy 与 Cloudflare 搭配的文章,同时介绍一下 Cloudflare CDN 的使用。本文方法只适用于 Caddy2。

前序工作

申请一个 Cloudflare 帐号,添加网站,把域名解析的服务器设置为 Cloudflare 提供给你的那两个,Cloudflare 会自动搜索子域名,如果不全自己补充。确定你要走 CDN 的网址被代理,即连接通过橙色的云。

screenshot_2021-07-20-1[1].jpg

问题

Cloudflare CDN 加速网站时,允许 4 种加密模式,由下图所示,越严格越安全。我希望源站也能开启 Https。

screenshot_2021-07-20-3[1].png

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

下载地址,记得勾选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模块。

screenshot_2021-07-21-4[1].png

用自行编译/下载的 Caddy,替换原来的 Caddy, Caddy 一般安装在 /usr/bin/caddy, 用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) }

一个例子:

screenshot_2022-01-26-0[1].png

获得 Cloudflare API token 在 Cloudfalre 网站打开 Dashboard,找到 API 选项,https://dash.cloudflare.com/profile/api-tokens ,新建 API TOKEN,如模块作者写的那样设置。

screenshot_2021-07-21-5[1].png

我新建了一个这样的 Token 作为参考。

screenshot_2021-07-21-6[1].png

记得保存好你的 Token 字符串,它只会显示一次。我申请了几个 Token,格式并不统一。

测试

在 Cloudflare 的 DNS 管理页面下新添加一个子域名,并选择路由模式,在 Caddyfile 配置文件中增加对应的网站。停止 Caddy 服务,然后手动运行 Caddy ,看看是否能正常申请到证书。

sudo caddy run -config /etc/caddy/Caddyfile

成功申请。

screenshot_2021-07-22-7[1].png

本文作者:尽力局副局长

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!