转载

Certbot 与 Nginx:证书签发、续期和加载验证

整理 HTTPS 证书签发与续期流程,纠正 HTTP-01 校验端口和低频续期计划,说明证书文件与 Nginx 实际加载结果的核对方法。

选择验证方式,而不是先停止所有 Web 服务

原文的 standalone 示例使用 HTTP-01 验证,对外需要的是 80 端口,不是 443。域名解析、云防火墙、主机防火墙与实际监听都需要满足验证条件。

如果 Nginx 已经服务于该域名,可评估 webroot 或 Nginx 插件方式,避免为签发证书停掉整站。standalone 会临时启动验证服务,因此要处理它与现有 80 端口监听的冲突。

首次签发的核对顺序

  1. 从 Certbot 官方入口 按操作系统和服务方式安装;不要假定所有发行版都有相同包。
  2. 确认域名的相关 DNS 记录指向预期服务器。
  3. 选择与现有部署方式匹配的验证插件。
  4. 先在合适的测试流程中检查挑战能否完成,再执行正式签发。

历史 standalone 命令形式如下,域名必须替换为自己控制且已正确解析的域名:

sudo certbot certonly --standalone -d example.com -d www.example.com
sudo certbot certificates

此处没有执行任何证书签发。证书的实际名称和文件路径以 certbot certificates 输出为准,不能假定一定是 www.example.com 目录。

自动续期应定期检查,而不是两个月才运行一次

原文的低频 cron 计划缺少失败重试机会,也把证书生命周期与任务触发周期混在一起。本次删除固定两个月续期的写法。

先检查安装方式是否已经配置了 systemd timer 或 cron。已有自动任务时不要重复添加。续期流程由 certbot renew 判断哪些证书需要续期,并应定期执行、记录失败和检查服务加载结果。

sudo certbot renew --dry-run

演练成功不等于未来永远成功,DNS、端口和凭据变化后仍应重新检查。使用 webroot 或其他插件时,需确保其验证路径和权限长期可用。

Nginx 加载证书的配置形态

以下是配置片段,CERTIFICATE_NAME 必须替换成实际名称:

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/CERTIFICATE_NAME/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/CERTIFICATE_NAME/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8888;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

先用 nginx -t 检查配置,再采用现有服务管理方式重载。续期成功后的 deploy hook 可用于触发检查和重载,但路径、权限和服务名称需要按实际系统配置。不要把未经检查的重载命令当作通用安装脚本。

最终从客户端检查域名、证书链和有效期,确认 Nginx 正在提供新的证书,而不只是磁盘文件已经变化。

参考

正文到此结束