Certbot 实战:使用 Webroot 模式实现证书自动续期
在为移动端应用配置 Universal Links 或微信分享域名(如 auth.imwind.cc)时,HTTPS 是强制性的安全要求。虽然 Certbot 默认的 --nginx 插件可以一键完成配置,但它会自动修改 Nginx 配置文件,这在生产环境或复杂配置下往往不够稳健。
本文将介绍如何使用 Webroot 模式,在不侵入原有 Nginx 逻辑的前提下,实现证书的自动化获取与续期。
一、 为什么选择 Webroot 模式?
相比于直接让 Certbot 接管 Nginx 配置,Webroot 模式具有以下优势:
- 非侵入性:Certbot 只负责在指定目录生成验证文件,不会触碰你的
nginx.conf,避免配置被意外搞乱。 - 可控性高:你可以自由定义 HTTPS 相关的 SSL 参数(如 HSTS、加密套件等)。
- 兼容性强:适用于 Docker 容器化环境或复杂的反向代理架构。
二、 工作原理:验证与分离
Webroot 的工作原理非常简单:Certbot 在你的 Web 根目录下放置一个临时文件,Let's Encrypt 的服务器通过 HTTP 访问这个文件,验证你对该域名的所有权。
三、 配置步骤
1. 准备验证专用目录
为了不影响业务代码,建议创建一个独立的目录专门用于存放 Let's Encrypt 的挑战文件(Challenge file):
sudo mkdir -p /var/www/letsencrypt
2. 配置 Nginx 响应验证请求
在你的 Nginx HTTP(80 端口)配置中,添加一个特定的 location 块。
server { listen 80; server_name auth.imwind.cc; # 关键配置:让 Certbot 的验证请求指向我们创建的目录 location ^~ /.well-known/acme-challenge/ { allow all; root /var/www/letsencrypt; default_type "text/plain"; } # 其他所有请求强制重定向到 HTTPS location / { return 301 https://$host$request_uri; } }
3. 使用 Certbot 申请证书
执行以下命令。注意我们使用了 certonly 参数,这告诉 Certbot “只管拿证书,别动我的配置”。
sudo certbot certonly --webroot \ -w /var/www/letsencrypt \ -d auth.imwind.cc \ --email your-email@example.com \ --agree-tos
4. 手动部署证书
成功后,证书文件会出现在 /etc/letsencrypt/live/auth.imwind.cc/ 目录下。你只需在 Nginx 的 443 端口配置中手动引用:
ssl_certificate /etc/letsencrypt/live/[auth.imwind.cc/fullchain.pem](https://auth.imwind.cc/fullchain.pem); ssl_certificate_key /etc/letsencrypt/live/[auth.imwind.cc/privkey.pem](https://auth.imwind.cc/privkey.pem);
四、 实现无人值守的自动续期
Let's Encrypt 的证书有效期为 90 天。由于我们是手动配置的 Nginx,证书续期后,Nginx 进程并不知道文件已更新。我们需要通过 Deploy Hook 自动重载 Nginx。
自动化钩子配置
在 Certbot 的续期任务中加入重载命令:
# 测试续期并注册重载钩子 sudo certbot renew --dry-run --deploy-hook "nginx -s reload"
这样,每次证书更新成功后,Certbot 都会自动执行 nginx -s reload,确保网站始终使用最新的证书。
五、 总结
Webroot 模式是 Certbot 方案中最灵活的一种。对于需要高稳定性的 API 域名或 App 关联域名(如 auth.imwind.cc)来说,这种方式既保证了证书的安全获取,又维持了服务器配置的纯净。