前言

现在有一个域名,想用做反向代理,再搭配上 Cloudflare 的 CDN,就可以不用暴露服务器地址和端口了。由于对 HTTPS 证书不熟悉,所以选择了 Caddy ,它可以自动配置 HTTPS,结果成功踩坑。

Caddy 申请证书,Let’s encrypt 会去验证请求的服务器 IP 和 域名解析到的 IP 是否相同,所以一旦打开 Cloudflare 的 CDN,证书就无法申请成功。如果不开 Cloudflare 的 CDN,仅解析 DNS ,又会直接暴露网站源 IP。无法达成需求。

后来发现可以给 Caddy 编译上 tls.dns.cloudflare 模块,通过 Cloudflare 的 API 获取证书,结果 Cloudflare 取消了对 .ml , .tk , .cf 这些免费域名的 API 支持。所以最后只能手动申请证书,修改 Caddy的配置了。此处记录一下操作过程。

Caddy部署

这里是参考官方文档,安装的 Caddy2。

1
2
3
4
5
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

手动生成证书并部署

由于 Caddy 自动生成证书,需要使域名指向 Host,无法使用 Cloudflare 的 CDN。因此采用手动生成证书部署的方式进行部署。这里使用 github 的一个开源项目 acme.sh 生成证书。

1. 安装 acme.sh

1
curl  https://get.acme.sh | sh -s email=my@example.com

2. 生成证书

执行下面这条命令,acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可。

1
acme.sh --issue --dns -d *.lovecarrot.me --yes-I-know-dns-manual-mode-enough-go-ahead-please

等待解析完成之后,重新生成证书,下面这个命令会生成一个泛域名证书,这样后期所有在这个域名下的子域名都可以直接使用这个证书。

1
acme.sh --renew -d *.lovecarrot.me --yes-I-know-dns-manual-mode-enough-go-ahead-please

将证书复制到一个指定目录,在 Caddyfile 文件中手动指定。Caddyfile 默认位置在 /etc/caddy 这个目录下。我这里新建了一个目录 ssl ,用于存放证书。执行以下命令,将证书拷贝过去。

1
2
3
4
5
mkdir /etc/caddy/ssl
acme.sh --install-cert -d *.lovecarrot.me \
--cert-file /etc/caddy/ssl/cert.pem \
--key-file /etc/caddy/ssl/key.pem \
--fullchain-file /etc/caddy/ssl/fullchain.pem \

3. Caddyfile 示例

这里就该手动配置 Caddyfile 文件了,我的配置如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 用于裸域做反向代理。
lovecarrot.me {
# 后面是上一步拷贝过来的证书路径
tls /etc/caddy/ssl/cert.pem /etc/caddy/ssl/key.pem
reverse_proxy localhost:1000
}

# 这是泛域名相关配置
*.lovecarrot.me {
tls /etc/caddy/ssl/cert.pem /etc/caddy/ssl/key.pem

# 对于不同子域名,可以采取如下方式配置,共用上面的证书文件。
@foo host foo.lovecarrot.me
handle @foo {
reverse_proxy localhost:1001
}

@bar host bar.lovecarrot.me
handle @bar {
reverse_proxy localhost:1002
}
}

参考: