核心是避免逐个手动操作、防止配置不一致、杜绝服务中断;关键在于统一存放+命名规范、配置复用+动态路径、自动化续期+零中断更新、闭环验证与兜底机制。

多域名环境下更新 SSL 证书,核心是避免逐个手动操作、防止配置不一致、杜绝服务中断。关键不在“换文件”,而在“怎么换得稳、换得准、换得自动化”。
统一存放 + 命名规范
所有域名的证书(包括多域名证书或单域名证书)应集中存放在同一目录,比如 /etc/nginx/ssl/,并采用清晰命名规则:
-
多域名证书:用主域名命名,如
app.example.com.crt和app.example.com.key,并在申请时明确包含所有子域和别名(api.example.com、admin.example.com、shop.otherdomain.com等); -
独立证书:按域名分组,如
site-a.com.crt、site-b.net.crt,避免混用后缀或随意缩写; - 私钥权限必须设为
600,证书文件建议644,防止泄露。
配置复用 + 动态路径(推荐用于 10+ 域名)
不用为每个域名写一个 server 块。利用 Nginx 的 SNI 特性与变量,实现一份配置覆盖多个域名:
- 在
server块中使用ssl_certificate /etc/nginx/ssl/$ssl_server_name.crt;和ssl_certificate_key /etc/nginx/ssl/$ssl_server_name.key;; - 确保每个域名的证书文件名与访问时的 Host 名完全一致(如请求
blog.example.com,则需存在blog.example.com.crt); - 设置 fallback 证书(如
default_server块),应对客户端不支持 SNI 或临时未配证书的域名,避免 502 或握手失败。
自动化续期 + 零中断更新
靠人工更新迟早出错。生产环境应依赖 Certbot + 定时任务:
- 用
certbot --nginx -d domain1.com -d domain2.com -d domain3.net一次性申请多域名证书,生成在/etc/letsencrypt/live/domain1.com/; - 配置 renewal hook:在
/etc/letsencrypt/renewal-hooks/deploy/下添加脚本,在续期成功后自动软链接到 Nginx 使用路径,并执行nginx -t && nginx -s reload; - 测试续期流程:
sudo certbot renew --dry-run,确认无报错再依赖 cron; - 避免直接修改
/etc/letsencrypt/live/下的符号链接目标——Nginx 应始终读取固定路径(如/etc/nginx/ssl/current.crt),由脚本更新该路径指向。
验证与兜底机制
更新不是“改完就完”,必须闭环验证:











