跳转至主要内容

晴雨技术笔记

Certbot签发通配符证书

杏川铭心 杏川铭心
发表于 2025年3月21日

本文将介绍如何使用 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 通配符证书配置成功!

杏川铭心
杏川铭心

名字越改越尬,但是网站一点没动🤪 曾用名Frank419(现在也是我在很多地方的用户名),网站站长。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注