如何应对 SSL 证书有效期缩短:自动续签与监控指南
数字证书颁发机构 Gworg(光网)宣布,从 2023 年 12 月 31 日开始,将停止签发为期一年的「TRUSTASIA」单域名 SSL 证书,这是市场上最后一款提供一年期免费 SSL 证书的产品。
鉴于阿里云等国内服务商广泛采用此证书,这意味着使用免费证书的网站需要每 3 个月进行一次续期。而网站的 SSL 证书一旦过期,网站便无法通过 HTTPS 安全访问,在主流浏览器中将无法打开,或者会显示安全警告。这一调整使得管理多个域名或子域的难度显著增加,许多个人网站和图床也面临因证书过期而暂时下线的威胁。
本文按「从省事到灵活」介绍几种续签方案,你可以对号入座:
- 不想碰命令行:把域名托管到 Cloudflare,或把网站部署到 Vercel,证书全自动、零维护,直接看托管类续签。
- 有自己的服务器:用 Certbot 申请免费的泛域名证书并配置自动续签,一次配好覆盖所有子域名,下面详细讲。
- 用图床 / CDN:这类服务通常要手动换证,见 CDN 手动续签。
无论用哪种方案,最后都建议加一道证书监测兜底,避免证书悄悄过期。
Certbot 自动续签
Certbot 是一个免费的开源工具,用于自动获取并续签 Let's Encrypt 提供的 SSL/TLS 证书。它支持泛域名证书,一次申请即可覆盖所有子域名,省去逐个域名续签的麻烦。
需要注意的是,Certbot 默认的 HTTP 验证方式(HTTP-01)需要开放 80 端口,这在国内家用宽带或备案受限的环境下常常行不通。本文采用的是 DNS 验证方式(DNS-01),它不依赖 80 端口,只通过修改域名解析记录来验证所有权,更适合大多数场景。如果你更习惯图形界面操作,也可以改用反向代理工具 Nginx Proxy Manager 来申请和续签。

以下是使用 Certbot 在 Debian 11 系统上,通过 certbot-dns-aliyun 插件自动获取和续签阿里云托管域名的泛域名 SSL 证书的具体步骤。如果你使用的是其他域名托管服务,如 Cloudflare,则将插件替换为 certbot-dns-cloudflare,其他步骤相同。
1. 安装 Certbot 和插件
首先,安装 Certbot:
sudo apt update
sudo apt install certbot然后,安装 certbot-dns-aliyun 插件,以允许 Certbot 自动配置 DNS 记录,验证域名所有权。由于这个插件不在 Certbot 的官方仓库中,你可能需要使用 pip 来安装:
sudo apt install python3-pip
sudo pip3 install certbot-dns-aliyun2. 配置 AccessKey 凭证
在阿里云控制台创建一个拥有 DNS 配置权限的 AccessKey 密钥。
创建一个文件来保存你的 AccessKey 凭证,并确保文件权限安全:
sudo mkdir /etc/letsencrypt sudo touch /etc/letsencrypt/aliyun.ini sudo chmod 600 /etc/letsencrypt/aliyun.ini编辑
/etc/letsencrypt/aliyun.ini文件,输入你的 AccessKey 密钥信息:dns_aliyun_access_key = YOUR_ACCESS_KEY dns_aliyun_access_key_secret = YOUR_ACCESS_SECRET
3. 使用 DNS 插件获取证书
运行 Certbot 并指定 DNS 插件及配置文件:
sudo certbot certonly \
--authenticator dns-aliyun \
--dns-aliyun-credentials /etc/letsencrypt/aliyun.ini \
--dns-aliyun-propagation-seconds 60 \
-d "*.newzone.top" \
-d newzone.top-d 参数用于指定你想要证书覆盖的域名。上方的命令会为 newzone.top 和所有子域 *.newzone.top 获取证书,证书在同一个文件。若涉及多个域名,可通过添加多个 -d 参数来指定。如果不想多个域名的证书混在一起,建议分批执行上述命令。
4. 自动续签证书
先测试续签流程是否正常:
sudo certbot renew --dry-run测试成功后,证书在剩余有效期不足 30 天时便可续签,将有效期恢复至 90 天。但续签能否「自动」发生,取决于系统里有没有对应的定时任务:
- 通过
apt(Debian/Ubuntu)或snap安装的 Certbot,会自带并启用certbot.timer,无需额外配置; - 通过
pip安装,或部分发行版(如阿里云 Linux、CentOS)自带的 Certbot,不会自动创建定时任务,需要手动设置,否则证书到期也不会续签。
先确认定时任务是否存在:
systemctl list-timers | grep certbot如果有输出,说明 certbot.timer 在跑,到此即可。如果没有任何输出,就必须手动添加续签任务,否则自动续签形同虚设——这是很多人「按教程设置了却没续签」的真正原因。
方式一:添加 cron 任务
sudo crontab -e加入以下内容(Let's Encrypt 官方建议每天检查两次,到期不足 30 天才会真正续签):
0 0,12 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"保存后验证是否写入:
sudo crontab -l | grep certbot--deploy-hook 会在续签成功后自动重载 Nginx,相当于一并完成了下文第 5 步的工作(两种方式留一个即可)。若 which certbot 显示的路径不是 /usr/bin/certbot,需在命令里写上完整路径,避免 cron 环境找不到。
方式二:通过宝塔面板添加
如果你使用宝塔面板,也可以借助它的「计划任务」来调度。注意这里只是把宝塔当作「定时器」来运行 Certbot 命令,证书仍由 Certbot 申请和续签,不受宝塔本身不支持泛域名的限制:
进入宝塔面板「计划任务」。
任务类型选择 Shell 脚本。
执行周期设为 每天(如凌晨 3 点),或 N 小时(如每 12 小时)。
脚本内容填入:
certbot renew --quiet --deploy-hook "systemctl reload nginx"保存后点击「执行」手动跑一次,在日志中确认无报错。
宝塔的计划任务默认就以 root 身份运行,脚本里不要再加 sudo。root 下 sudo 本就多余,而部分精简系统或容器没装 sudo,其 PATH、环境变量也可能与直接 root 不同,反而会导致 certbot 或 systemctl 找不到、报错。如果手动执行能成功、定时跑却失败,多半就是这类环境差异,可把命令改成绝对路径排查,例如 /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"。
注意:使用 Certbot 与某些云服务提供商(如阿里云)进行首次自动续签时,Certbot 的自动续签行为有时可能被云服务平台误认为是异常的 Access Key 调用行为,导致系统自动触发安全警报。比如,阿里云半夜给我打电话通知风险(还好我开启了免打扰,尽管这类通知十分必要)。如果你接收到了此类通知,不必太担心,只需进行正常检查即可。
5. Nginx 配置
证书续签成功后,Nginx 不会自动应用新证书文件,需要重载配置才能生效。最省心的做法是给 Certbot 配置一个 deploy hook:续签成功就自动重载 Nginx。
在 /etc/letsencrypt/renewal-hooks/deploy/ 下创建脚本:
sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh写入内容:
#!/bin/bash
systemctl reload nginx赋予执行权限:
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh然后在 Nginx 配置里,直接引用 /etc/letsencrypt/live/<域名>/ 下的证书即可(这个目录本身就是指向最新证书的软链接):
server {
listen 443 ssl;
server_name newzone.top;
ssl_certificate /etc/letsencrypt/live/newzone.top/fullchain.pem; # 组合证书文件路径
ssl_certificate_key /etc/letsencrypt/live/newzone.top/privkey.pem; # 私钥文件路径
}CDN 手动续签
对于使用图床或 CDN 服务的用户,由于云服务商的授权问题,证书可能无法通过 Certbot 等服务自动续签。例如,阿里云和七牛云都提供了 SSL 证书的相关接口,但根据客服的说法,这些接口并不能用于替换 CDN 的域名证书,自动续签只支持付费 SSL 证书,免费用户必须手动执行证书续签过程。
即使是手动续签,你依然可以继续使用通过自动化工具获得的泛域名证书。下面介绍手动续签的具体步骤:
定位证书文件
Certbot 的泛域名证书通常存放在
/etc/letsencrypt/live目录下。对于使用 nginx-proxy-manager 的用户,证书则存储在config/letsencrypt/archive目录中,该目录下包含多个以npm-开头的编号文件夹,例如npm-1,这里的数字表示证书的申请序号。
上传证书至 CDN
在 CDN 的管理界面中自定义上传证书来替换旧的泛域名证书。粘贴
fullchain.pem文件的内容作为证书(公钥),privkey.pem文件的内容作为私钥。
CDN 证书上传界面
托管类续签
CDN 托管:将域名托管到 Cloudflare 并开启代理后,本质上相当于让访客先连接到 CF 网络,这一段流量就由它负责加密了,所以会自带 SSL 证书。

全托管部署:当你将网站部署在 Vercel 时,所有的内容都托管在它的网络上,因此不需要用户自己上证书。(@PlatyHsu)
宝塔面板:我曾通过宝塔面板来自动续签 SSL 证书,但它不支持泛域名且仅限于服务器托管的域名。此外,当我试图续签多达 10 个子域名的 SSL 证书时,其中有 3 个子域名的续签尝试失败了。此外,宝塔面板面临许多争议,使用时注意风险。
SSL 证书监测
即使配置了自动续签,也建议加一道监控兜底。万一续签因为接口变动、配置出错、Access Key 失效等原因悄悄失败,你能在证书过期前收到提醒,而不是等网站打不开了才发现。
我使用 Uptime Kuma 来监控 SSL 证书的状态,以下是监控设置步骤:
- 进入 Uptime Kuma 实例,点击右侧“+”按钮来添加一个新的监控项目。
- 选择监控类型。对于 SSL 证书监控,选择“HTTP(s)”类型,因为这涉及到监测一个使用 SSL 证书的网站或服务。
- 在下方「高级」设置中,勾选启用「证书到期时通知」。

完成这些步骤后,Uptime Kuma 将开始监控指定网站的 SSL 证书状态。如果证书接近到期日期,你将根据你的通知设置收到警报。Uptime Kuma 默认会在 TLS 证书剩余有效期少于 21 天、14 天、7 天时发送提醒通知。你也可以在设置>通知>TLS 证书过期通知,修改提前通知天数。
如果只需要监测 SSL 证书的到期日期,也可以考虑更轻量的 Domain Admin。
更多
我很难理解国内云服务商对 SSL 证书的做法。提高 SSL 证书费用的同时增加免费证书续签的难度,这样的策略似乎是为了鼓励用户购买付费证书。然而,这种做法可能没有充分考虑到国内用户的付费习惯。对于像我这样的用户,云服务开销主要集中在服务器和 CDN 流量上,不会考虑昂贵的 SSL 证书。目前市场上,单域名 SSL 证书的年费用已超过 300 元,若需覆盖多个子域名,则需购买泛域名证书,费用更是高达 1000 元以上,这甚至超过了我为服务器所支付的费用。
云服务商的这种定价策略可能源自他们自身面临的高运营成本,如昂贵的商业宽带费用等。面对这样的压力,他们可能无奈地将成本转嫁到 SSL 证书等终端产品上。尽管这可以理解,但对于像我这种个人用户来说,当 SSL 证书的开销超过服务器本身时,显然难以接受。这也是我写这篇文章的原因。