certbot 能自动申请 SSL 证书并且自动在证书快到期时更新证书。一般来说,将域名的 A 记录指向对应的 IP 地址,并在此地址的机器上使用 certbot 申请即可。但有一些特殊情况,比如需要通配符证书,或在其他不方便将 A 记录指向某个 IP 的场景下,如果你的域名托管在 cloudflare,那么就可以用 api token 的方式申请证书。
1、创建令牌
首先需要去 cloudflare 创建一个 API 令牌( >去创建)。点击「创建令牌」,使用「编辑区域 DNS」模版。在详情界面选择域名。创建完成后,「复制令牌」到某个地方。
2、安装 certbot 及 certbot-cloudflare 插件
certbot 需要通过 snap 安装。如果你是 Ubuntu 系统,应该已经预装了 snapd。如果是没有预装 snapd 的系统(比如 Debian),则需要手动安装。可以参考 Snap 官方安装文档,涵盖了各种系统。本文以 Debian 为例。
安装 snapd:
apt update && apt install -y snapd
snap install snapd core && snap refresh core
移除系统可能预装的 certbot:
sudo apt-get remove certbot
安装 certbot 和 certbot-cloudflare 插件:
snap install --classic certbot && ln -s /snap/bin/certbot /usr/bin/certbot
snap set certbot trust-plugin-with-root=ok
snap install certbot-dns-cloudflare
3、使用 certbot 获取证书
创建配置文件:
mkdir -p .secrets/certbot
使用编辑器,创建 cloudlfare.ini 配置文件,以 VIM 为例:
vi .secrets/certbot/cloudflare.ini
添加配置内容:
dns_cloudflare_api_token = cloudflare_api_token_you_have_copied
将 cloudflare_api_token_you_have_copied 替换为创建令牌时复制的令牌值。
将配置文件的权限设置为 600:
chmod 600 .secrets/certbot/cloudflare.ini
使用 certbot 获取证书:
certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini \
-d example.com
将 example.com 替换为你的域名即可。
- 这里可以使用通配符域名来获取通配符证书。例如:
-d *.example.com - 也可以追加多个 -d 参数来获取多个子域名的证书。例如:
-d example.com -d www.example.com
不出什么问题的话,证书就申请成功并自动下载了,可以观察命令的输出中一般有类似的提示:
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem
这里的路径就可以在 nginx 配置文件中用上。
除了 Cloudflare 外,域名托管在 DigitalOcean、dnsimple、OVH 等平台的也有对应的 certbot 插件可以获取通配符证书,插件的使用方式基本一致,可参考 certbot 官方文档。