
Certbot签发通配符证书

本文将介绍如何使用 Certbot 在 Ubuntu 22.04 系统上自动签发通配符 SSL 证书并实现自动续期。
目录
什么是 Certbot ?
Certbot 是一个命令行工具,可以从 Let’s Encrypt 获取 SSL 证书,也是 Let’s Encrypt 官方推荐使用的工具。支持 Windows、Linux 等多个平台。
Certbot 还实现了与众多 Web 服务器(例如 Apache、nginx)的集成,可以自动在兼容的服务器上安装证书,可以说是非常的方便了。
安装 Certbot
以 Ubuntu 22.04 系统为例:
最新的几个 Ubuntu 版本都开始使用 snap 来安装 Certbot 插件了,所以我们也需要用 snap 本体来安装 Certbot:
sudo apt-get remove certbot
sudo snap install certbot --classic
然后启用 Certbot 的插件功能:
sudo snap set certbot trust-plugin-with-root=ok
安装 DNS 插件。由于我们要颁发的是通配符证书,因此只能选用 dns-01
也就是用 DNS 记录来验证的方式。为了确保能自动续期(而不是每次续期都去服务商那里该记录),我们需要插件。这里以 Cloudflare 为例:
sudo snap install certbot-dns-cloudflare
其他的 DNS 插件还有很多,在此不一一列举。(完整的列表在官方文档里面有。)
配置 Certbot
这里我们只需要创建一个文件,剩下的交给 Certbot 处理就好。
继续以 Cloudflare 为例,文件中填入你的 Cloudflare API 令牌信息就行,像这样:
dns_cloudflare_api_token = <你的令牌>
然后保存,比如说保存到/etc/letsencrypt/cloudflare.ini
。
接下来修改文件的权限,防止他人读取:
sudo chown root:root /etc/letsencrypt/cloudflare.ini
sudo chmod 400 /etc/letsencrypt/cloudflare.ini
用 Certbot 签发证书
修改完之后就可以签发证书了。
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials \
/etc/letsencrypt/cloudflare.ini \
-d example.com \
-d *.example.com
这里解释一下各个参数的含义:
certonly
:代表只签发证书,不进行安装。由于 Certbot 默认会把证书安装到服务器级别,因此容易被扫 IP 的发现 IP 和域名的对应关系;套了 CDN 或防护的尤其要注意。--dns-cloudflare
:代表使用 Cloudflare DNS 插件来进行 DNS 验证。--dns-cloudflare-credentials
:代表存储你 Cloudflare API 密钥文件的位置。-d
:代表要签发证书的域名。
第一次运行会询问你的邮箱地址。这个地址本来是用于接收证书过期通知的,不过 Let’s Encrypt 最近已经决定暂停邮件通知,所以不用太在意。
正常来讲证书 1 分钟左右就签发成功。签发完的证书会放在/etc/letsencrypt/live/<你的域名>/
这个目录下。其中privkey.pem
是私钥,fullchain.pem
是带有完整证书链的证书;基本上我们都是使用这两个文件。
配置 Certbot 自动续期
接下来就需要配置自动续期了。自动续期的方式有两种,一种是全自动的,还有一种需要我们自己配置一下。
全自动续期
在某些兼容的系统上,Certbot 会自动创建一个certbot.timer
的 systemd 对象,来实现自动续期。
可以执行这个命令来检查全自动续期是否生效:
sudo systemctl status certbot.timer
如果命令有输出,那么恭喜你,自动续期是 OK 的。不过由于我们申请的时候没有附加--deploy-hook
参数,可能需要编辑一下证书续期配置(certbot reconfigure
)或者自动重启 Web 服务器也 OK。
如果没有输出,则代表无法全自动续期,需要我们自己配置。
手动配置续期
并不是说有全自动续期就不能手动配置。如果你不放心,你也可以进行手动配置;Certbot 已经猜到有人会这么干,并且会自动决定最终的续期方式。
手动配置的原理也很简单,就是 Linux 计划任务(cron)。
先新建一个任务:
sudo vim /etc/cron.d/letsencrypt
然后填入以下配置:
0 4 * * 0 root certbot renew --deploy-hook "/usr/local/bin/deploy.sh"
这段配置的意思是,每周日的凌晨4点,尝试使用 root 账户执行续期命令。
这里的/usr/local/bin/deploy.sh
是我自己编写的一个脚本,里面是重启 Web 服务器的命令。需要根据实际情况进行修改。
测试 Certbot 能否续期证书
至此(假设你已经配置好 Web 服务器),你的网站已经有通配符 SSL 了。不过在这之前,最好检查一下续期功能是否正常。
运行以下命令:
sudo certbot renew --dry-run
命令中的--dry-run
参数代表使用 Let’s Encrypt 的测试服务器来模拟真实情况。
如果没成功,可以等一会再试一次,或者检查一下配置是否有问题。
如果成功了,那么恭喜你,Certbot 通配符证书配置成功!