外观
HTTPS 证书申请与续期操作指南:申请、部署、自动续期
约 907 字
HTTPS证书续期
本说明给出证书从申请到自动续期的完整流程:用 ACME 客户端完成域名验证并签发证书,把证书部署到 Nginx 并校验链路,最后确认续期任务能自动执行且失败可见。证书到期导致的站点不可用属于完全可以避免的故障。
一、适用范围
- 适用:域名已解析到本机且 80 端口可从公网访问;Nginx 已配置站点;使用 Let's Encrypt 等 ACME 证书;单域名或常规多域名证书。
- 不适用:需要 OV、EV 组织验证证书的采购流程;仅内网访问、无法完成 HTTP 验证的环境,应改用 DNS 验证;通配符证书的多账号权限管理。
二、准备工作
| 项目 | 要求 | 检查方法 |
|---|---|---|
| 域名解析 | example.com 与 www 均指向 203.0.113.10 | dig +short example.com www.example.com |
| 80 端口 | 公网可访问且未被拦截 | curl -I http://example.com 有响应 |
| Nginx | 站点已启用并运行 | systemctl is-active nginx 返回 active |
| 客户端 | certbot 已安装 | certbot --version 输出版本号 |
| 联系邮箱 | 可接收到期提醒的运维邮箱 | 邮箱可正常收信 |
| 时间基准 | NTP 已同步 | timedatectl 中 synchronized 为 yes |
注意事项:
- HTTP 验证要求 80 端口对外可达,CDN 或 WAF 的回源限制会直接导致验证失败。
- 申请前确认域名没有限制签发机构的 CAA 记录,否则 ACME 服务会拒绝签发。
三、操作步骤
本节拆成三个子步骤,建议按顺序执行;每一步完成后先确认结果,再进入下一步。
3.1 证书申请
完成域名验证与签发,确认证书覆盖主域与 www。详见 3.1 证书申请。
3.2 证书部署
在 Nginx 中挂载证书并验证链完整、协议合规。详见 3.2 证书部署。
3.3 自动续期配置
用 timer 或 cron 触发续期,并通过钩子自动重载服务。详见 3.3 自动续期配置。
四、验证方法
- 执行
sudo certbot certificates,预期列出一条证书、状态 VALID、剩余天数大于 60 天。 - 执行
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -issuer -dates,预期输出发签发者与到期日。 - 执行
systemctl list-timers,预期存在 certbot.timer 且 NEXT 时间在 24 小时内。 - 执行
sudo certbot renew --dry-run,预期输出Congratulations, all simulated renewals succeeded。
五、常见问题
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 验证失败 unauthorized | 80 端口不可达,或返回了非预期内容 | 检查安全组、默认站点与跳转规则 |
| 签发被拒 CAA | 域名存在限制签发机构的 CAA 记录 | 调整 CAA 记录或改用允许的签发机构 |
| 已续期但站点仍旧证书 | 续期后未重载 Nginx | 配置 deploy-hook 执行 reload |
| dry-run 报 too many failed authorizations | 短时间重复失败触发限流 | 等待限流窗口结束,先修复验证路径 |
| 浏览器提示名称不匹配 | 证书未包含 www 子域 | 申请时同时提交 -d example.com -d www.example.com |
六、回滚与注意事项
- 回滚:删除
/etc/letsencrypt/live/example.com后重新签发;Nginx 配置从/root/nginx-cert.bak还原并执行nginx -t校验。 - 注意:私钥权限必须为 600 且属主 root,不要把 privkey 复制到 Web 目录或纳入打包。
- 注意:
--dry-run只做模拟,不改变现有证书,可用于验证续期链路,但不能替代到期前的真实检查。