之前我一直使用:
1 | certbot --nginx |
来自动申请和配置 HTTPS 证书。
这种方法虽然方便,但在实际使用中,我遇到了比较严重的问题:
- certbot 会自动修改 nginx 配置
- certbot 会自动 reload/restart nginx,导致systemd 状态与 nginx 实际状态脱节,出现“游离 nginx”,然后第一个证书成功、后面失败
最终决定迁移到:
1 | certbot --webroot |
这种模式下:
- certbot 不再接管 nginx
- 不再自动修改 nginx 配置
- 不再 reload/restart nginx
- nginx 完全手动管理
一、安装 certbot
Ubuntu:
1 | sudo apt update |
二、创建 challenge 目录
统一使用:
1 | mkdir -p /var/www/.letsencrypt/.well-known/acme-challenge |
说明:
- certbot 以 root 身份运行,因此无需
www-data写权限 - nginx 只需要可读权限
三、配置 nginx challenge 路由
在所有 80 端口 server 中加入:
1 | location /.well-known/acme-challenge/ { |
例如:
1 | server { |
四、申请证书
1 | certbot certonly --webroot -w /var/www/.letsencrypt -d fupengcheng.top |
说明:
| 参数 | 含义 |
|---|---|
| certonly | 只申请证书,不修改 nginx |
| —webroot | 使用 webroot challenge |
| —cert-name | 指定证书名称,可选,默认为域名 |
| -w | challenge 根目录 |
| -d | 域名,可多个 |
五、查看证书
1 | certbot certificates |
证书通常位于:
1 | /etc/letsencrypt/live/fupengcheng.top/ |
例如:
1 | /etc/letsencrypt/live/fupengcheng.top/fullchain.pem |
六、配置 nginx HTTPS
在 nginx 中手动配置:
1 | ssl_certificate /etc/letsencrypt/live/fupengcheng.top/fullchain.pem; |
例如:
1 | server { |
七、重启 nginx
1 | nginx -t |
八、测试续期
1 | certbot renew --dry-run |
如果成功,说明:
- challenge 正常
- 自动续期正常