Certbot 实现 Nginx HTTPS 自动化需三步:域名解析与服务准备就绪、首次用 --nginx 参数申请、续期配置 --deploy-hook 重载 Nginx;缺一不可,否则验证或续期失败。

用 Certbot 实现 Nginx 的 HTTPS 证书自动化申请和更新,关键不在“多复杂”,而在于三步到位:域名与服务准备充分、首次申请用对命令、续期机制真实可用。
确保基础条件全部满足
这一步卡住的人最多。缺一不可:
- 域名已正确解析到服务器 IP(用
dig domain.com +short和curl -4ifconfig.me对照验证) - Nginx 正常运行且配置无语法错误(执行
nginx -t必须显示success) - 80 端口和 443 端口对外放行(本机防火墙 + 云平台安全组都要检查)
- 网站根目录(如
/var/www/html)对 Nginx 进程用户(如nginx或www-data)有读写权限,尤其要能写入/.well-known/acme-challenge/
用 --nginx 参数一次性完成申请与配置
别用 certonly,除非你明确要手动改 Nginx 配置。直接运行:
sudo certbot --nginx -d example.com -d www.example.com
它会自动做四件事:
- 调用 HTTP-01 方式验证域名(在 80 端口的 server 块里临时加好
location ^~ /.well-known/acme-challenge/) - 向 Let’s Encrypt 申请证书并存到
/etc/letsencrypt/live/example.com/ - 修改对应 Nginx server 块:加入
ssl_certificate和ssl_certificate_key指令 - 默认添加 HTTP → HTTPS 的 301 强制跳转(选 “2: Redirect” 即可)
验证并启用自动续期
续期不是装完就自动跑,必须手动验证 + 显式配置重载:
- 先测试流程是否通:
sudo certbot renew --dry-run,看到 Congratulations, all simulated renewals succeeded 才算过关 - 失败常见原因:Nginx 配置错、80 端口被其他进程占、
/.well-known路径没配在 HTTP server 块里、DNS 解析失效 - 确认成功后,加定时任务(推荐 cron):
0 3 * * * /usr/bin/certbot renew --quiet --deploy-hook "/usr/bin/systemctl reload nginx" -
--deploy-hook是重点:没有它,证书更新了,Nginx 仍用旧证书
后续维护要点
证书生命周期管理不靠记忆,靠检查习惯:
- 查当前所有证书:
sudo certbot certificates - 手动触发一次续期(比如换服务器后):
sudo certbot renew --force-renewal - 证书文件路径必须和 Nginx 配置中写的完全一致,不能手误写成
example.com和www.example.com混用不同路径 - 如果用了通配符证书(
*.example.com),Certbot 不支持 DNS-01 自动验证,得换acme.sh或手动配合云厂商 API


















