用 certbot 给多个站点签证书
发布时间:2026-04-25 13:11       
更新时间:2026-04-26 02:45
一台服务器上挂着几个站点时,证书可以逐个域名签,也可以在一条命令里带全。用 certbot(HTTPS 证书自动签发工具)的 webroot 模式,续期全自动,基本可以装完就忘。
一、webroot 方式签多站
webroot 模式靠站点目录下的验证文件完成验证,不需要停 nginx:
certbot certonly --webroot -w /var/www/site1 -d example.com -d www.example.com -w /var/www/site2 -d example.org
-w 和 -d 参数按组对应,读起来一目了然,示例里的域名换成自己的即可,参数顺序不变。前提是每个域名的 DNS 已指向本机,且对应站点的 root 目录可写——certbot 会往 .well-known/acme-challenge/ 里写验证文件;验证文件能被外网访问的前提是站点配置正常,站点本身 404 时先修站点再签证书。签好的证书落在 /etc/letsencrypt/live/对应域名/ 下,nginx 里引用其中的 fullchain.pem 和 privkey.pem。以后新增站点,重新跑一遍带全部域名的 certonly 命令,按提示选择扩展即可。
二、续期与自动 reload
这类证书九十天有效,靠 certbot renew 自动续期。先演练一遍:
sudo certbot renew --dry-run
dry-run 会走完整的验证流程但不落盘,续期配置有错当场暴露。续期成功后 nginx 需要 reload 才会加载新证书,往钩子目录放一个脚本即可一劳永逸:
echo 'systemctl reload nginx' > /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
deploy 钩子在任何一张证书续期成功后执行,多站共存时正好全量 reload。多站环境下 renew 命令不需要指定域名,它会自动读取 renewal 目录里的全部配置。systemd 环境下定时任务叫 certbot.timer,systemctl list-timers 能看到下次执行时间。
三、失败提醒别裸奔
自动续期最大的风险是悄悄失败,三个月后过期才发现。certbot 的 renewal 配置里填好 email 字段,续期失败会有邮件,前提是服务器能发信,配了中继的直接可用。更稳的做法是加个每日检查:
openssl x509 -enddate -noout -in /etc/letsencrypt/live/example.com/fullchain.pem
到期不足十四天就告警,双保险。检查频率每天一次足够,余量还多时告警只是提醒,不至于手忙脚乱。
四、验证与收尾
签完和续期后用浏览器或 openssl 确认各站点证书正常即可。站点多的服务器,建议在 nginx 里用一个 include 目录统一管理各站点的证书引用路径,续期后 reload 一次全部生效,出问题时排查也只需要看一个目录。