Caddy使用Cloudfare DNS颁发证书

起因

因为部署了很多静态网站,且有几十个域名都需要SSL(HTTPS)证书,所以就把Caddy这个大佬上线了(当然你也可以使用acme脚本来自动签发、续签证书),至于Caddy 是个啥,官方首页给出了解释:

Caddy 2 is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go

通俗点来说,就是一款基于go开发的web服务器,它默认支持HTTP2、自动签发/续期SSL证书等,其他特点请移步Caddy官方查阅详情,目前Caddy最新版是v2。

环境依赖

需要说明的是,在此之前,我已经使用yum安装过caddy2了。

golang环境

代码语言:javascript
复制
[root@nginx software]# go version
go version go1.17.7 linux/amd64

xcaddy

The xcaddy command is the easiest way to build Caddy with version information and/or plugins.

代码语言:javascript
复制
[root@nginx software]# wget https://github.com/caddyserver/xcaddy/releases/download/v0.3.0/xcaddy_0.3.0_linux_amd64.tar.gz
[root@nginx software]# tar -zxvf xcaddy_0.3.0_linux_amd64.tar.gz 
LICENSE
README.md
xcaddy

编译caddy扩展

caddy有许多额外的扩展,可以通过官方的下载页面选择。这里我们需要cloudfare的扩展。需要注意的是,使用xcaddy编译扩展的时候,不需要我们pull caddy的源码,它会自动去拉取的。

代码语言:javascript
复制
[root@nginx software]# ./xcaddy build --with github.com/caddy-dns/cloudflare
[root@nginx software]# ./caddy list-modules
...
tls.get_certificate.tailscale
tls.handshake_match.remote_ip
tls.handshake_match.sni
tls.issuance.acme
tls.issuance.internal
tls.issuance.zerossl
tls.stek.distributed
tls.stek.standard

Standard modules: 96

dns.providers.cloudflare

Non-standard modules: 1

Unknown modules: 0
[root@nginx software]# which caddy
/usr/bin/caddy
[root@nginx software]# cd /usr/bin/
[root@nginx bin]# mv caddy caddy.bak
[root@nginx bin]# cp /data/software/caddy ./

可以看到cloudfare模块已经被编译进去了。

配置Cloudfare

caddy开启了cloudfare扩展之后就可以通过cloudfare的DNS来签发、续期证书了。 首先要登录到cloudfare后台来获取API 令牌,特别需要注意此处是要API令牌,不是API秘钥(Global API Key)。

之后你可以把这个令牌配置到环境变量里面,也可以直接写在caddy的配置文件里面(我测试的时候就是直接写到配置文件的)。

代码语言:javascript
复制
[root@nginx caddy]# vim /etc/caddy/Caddyfile
...
www.luohe.pub {
root * /data/wwwroot/www.luohe.pub
file_server
tls {
dns cloudflare API令牌
}
}
luohe.pub {
root * /data/wwwroot/www.luohe.pub
file_server
tls {
dns cloudflare API令牌
}
}

修改好配置文件之后,记得restart一下caddy进程,然后查看日志就可以看到caddy已经通过dns方式去申请证书了。