对于包含多个子域名的 Let's Encrypt 证书,续签时最稳妥的方式是直接使用 certbot renew 命令,它会自动读取保存的域名列表;若需手动干预,务必通过 `--cert-name` 指定证书名称,避免遗漏子域名导致新证书覆盖范围变小。
先说结论:自动续签优先,手动续签需锁定证书名称。
- 适合多域名证书维护
- 先确认现有证书名称
- 验收域名覆盖范围
命令速用版
大部分情况下,你不需要重新拼写完整的申请命令,Certbot 会记住之前的配置。
sudo certbot renew如果必须手动指定(例如修改了验证方式),请带上证书名称参数:
sudo certbot renew `--cert-name` 你的证书名称为什么会这样
Certbot 在首次申请证书后,会在 /etc/letsencrypt/renewal/ 目录下生成对应的配置文件,里面记录了当时包含的所有域名(SANs)。执行 renew 命令时,程序会读取这些配置,自动补全 -d 参数。
如果你手动运行 certbot certonly 并只写了一个域名,系统会认为你要申请一个新的、仅包含该域名的证书,而不是续签原有的多域名证书。这会导致旧证书的其他子域名在新证书中丢失,引发服务中断。
分步处理
1. 确认证书名称和包含的域名
sudo certbot certificates找到 Certificate Name 列对应的名称,确认 Domains 列包含了你需要的所有子域名。
2. 执行续签命令
推荐直接使用自动续签,它会检查所有即将过期的证书:
sudo certbot renew `--dry-run`先加 `--dry-run` 测试流程是否通畅,确认无误后去掉该参数正式执行。
3. 重载服务
续签成功后,Web 服务器通常不会自动加载新证书,需要重载配置:
sudo systemctl reload nginx或者在 Certbot 命令中配置 `--deploy-hook` 自动处理。
怎么验证是否生效
1. 本地检查证书信息
sudo certbot certificates查看 Validity 列的有效期是否已更新。
2. 命令行验证远程证书
echo | openssl s_client -connect 你的域名:443 -servername 你的域名 2>/dev/null | openssl x509 -noout -dates对比 notAfter 时间是否延长。
3. 浏览器检查
访问任意一个子域名,点击地址栏锁图标,查看证书详情中的“使用者备用名称”是否包含所有预期的子域名。
常见坑
1. 遗漏子域名:手动续签时只写了主域名,导致其他子域名证书失效。
2. 频率限制:Let's Encrypt 对证书申请频率有限制,频繁失败的重试可能触发锁定,建议先用 `--dry-run` 测试。
3. 钩子脚本失效:续签成功但 Web 服务未重载,导致网站仍显示旧证书,直到服务器重启。
4. 配置文件权限:/etc/letsencrypt/ 目录权限被误改,导致 Certbot 无法读取 renewal 配置。