主页
文章
知识库
云盘
工具
登录
登录
注册
忘记密码
反馈
文章
Let's Encrypt 配置Nginx SSL证书
Let's Encrypt 配置Nginx SSL证书
lyjin
2025-06-30
以下文章展示了在 Ubuntu(以 20.04 为例)上,通过 APT 安装 Certbot 并使用 `--nginx` 插件,一步完成 Let’s Encrypt 证书的获取、安装与自动续期的全过程。全文共分为五大部分,每部分都配有实用命令示例和丰富引用,帮助您快速上手并在生产环境中稳定运行。 在本文中,您将了解: 1. **Certbot 安装**:如何通过 APT 安装 Certbot 及其 Nginx 插件,并确认相关 systemd 定时器和 cron 任务已部署。 2. **使用 `--nginx` 插件获取证书**:一条命令完成 HTTP-01 验证、证书签发、Nginx 配置更新和重载。 3. **证书文件位置与说明**:Let’s Encrypt 证书存储目录及各文件用途。 4. **自动续期机制**:APT 安装后自带的 `certbot.timer`(systemd)与 `/etc/cron.d/certbot`(cron)如何协同工作,实现每日两次续期检查。 5. **验证与故障排查**:手动测试续期、查看日志、常见问题及自定义定时器的方法。 --- ## 一、通过 APT 安装 Certbot 与 Nginx 插件 ### 1. 更新软件源并安装 Certbot ```bash sudo apt update sudo apt install certbot ``` APT 安装的 Certbot 会自动在 `/lib/systemd/system/` 下部署 `certbot.service` 与 `certbot.timer`,并在 `/etc/cron.d/` 中添加 `certbot` 定时任务,为自动续期提供双保险。 ### 2. 安装 Nginx 插件 ```bash sudo apt install python3-certbot-nginx ``` 该插件使 Certbot 能够直接读取并修改 Nginx 配置,实现“申请→安装→配置→重载”一体化流程。 --- ## 二、使用 --nginx 插件获取并部署证书 ### 1. 一键申请与配置 ```bash sudo certbot --nginx -d your_domain -d www.your_domain ``` - Certbot 会调用 Nginx 插件在现有 `server` 块中自动添加: ```nginx ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem; ``` - 完成后自动重载 Nginx,无需您手动停止或编辑配置文件。 ### 2. 交互式提示 - **邮箱地址**:用于到期提醒与安全通知。 - **服务条款**:需同意 ISRG(Let’s Encrypt 背后组织)条款。 - **重定向 HTTP→HTTPS**:建议启用以统一安全访问。 --- ## 三、证书文件存放与说明 在完成申请后,所有 Let’s Encrypt 相关文件位于: ``` /etc/letsencrypt/live/your_domain/ ``` - `privkey.pem`:证书私钥,仅 `root` 可读; - `fullchain.pem`:站点证书 + 中间证书,用于 Nginx 等软件加载; - 其他如 `cert.pem`、`chain.pem` 供不同场景选用citeturn2view0turn0search4。 --- ## 四、自动续期机制详解 ### 1. systemd 定时器:certbot.timer APT 安装时,`/lib/systemd/system/certbot.timer` 默认包含: ```ini [Timer] OnCalendar=0/12:00:00 RandomizedDelaySec=3600 Persistent=true ``` - **每天 00:00 & 12:00** 各触发一次; - 随机延迟最多 3600 秒; - 若系统关机错过,会在重启后**立即**补触发citeturn1search5turn0search4。 #### 查看与启用 ```bash systemctl list-timers | grep certbot.timer sudo systemctl enable --now certbot.timer ``` 确认状态为 `loaded active waiting` 即可citeturn2search4。 ### 2. Cron 备份任务:/etc/cron.d/certbot 内容类似: ```cron 0 */12 * * * root test -x /usr/bin/certbot && perl -e 'sleep int(rand(3600))' && certbot -q renew ``` - 每 12 小时运行一次; - 仅在 systemd 定时器不可用时执行,避免双重触发citeturn0search2turn3search0。 --- ## 五、验证与故障排查 ### 1. 手动模拟续期 ```bash sudo certbot renew --dry-run ``` 输出 `Congratulations, all renewals succeeded.` 则续期流程正常。 ### 2. 查看执行日志 ```bash journalctl -u certbot.service journalctl -u certbot.timer ``` 定位挑战验证、续期或重载 Nginx 时的错误信息。 ### 3. 常见问题 - **定时器未触发**:检查 `/lib/systemd/system/certbot.timer` 是否被 override 或手动禁用; - **端口被占用**:如遇 HTTP-01 验证失败,确认 80 端口未被防火墙或其他服务阻挡; - **路径问题**:某些环境下 Certbot 二进制位于 `/usr/local/bin`,需在 cron 脚本中使用绝对路径。 --- ## 六、小结 通过 APT 安装 Certbot 并使用 --nginx 插件,您无需手动编辑任何 Nginx 配置即可完成 Let’s Encrypt 证书的申请、安装与自动续期。在 `certbot.timer` 与 Cron 的双重保障下,HTTPS 服务将始终保持最新、可靠。 --- ## 七、在一台服务器上管理多个域名与子域名 在生产环境中,您常常需要在同一台服务器上同时托管多个独立域名及各自的子域名。Certbot 和 Nginx 插件都能轻松应对这一需求: ### 1. 单一证书管理多个域名与子域名 您可以在一次命令中通过多个 `-d` 参数指定所有顶级域名及子域名,例如: ```bash sudo certbot --nginx -d your_domain -d www.your_domain -d api.your_domain -d blog.your_domain ``` 这样将为 `your_domain`、`www.your_domain`、`api.your_domain` 以及 `blog.your_domain` 签发一个包含这些名称的证书,并自动更新相应的 Nginx Server Block。 ### 2. Nginx 配置示例 在 /etc/nginx/sites-available/your_domain.conf 中,您可以使用统一的 Server Block 表示多主机名: ``` server { listen 80; listen [::]:80; server_name your_domain www.your_domain api.your_domain blog.your_domain; return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name your_domain www.your_domain api.your_domain blog.your_domain; ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; } location ~ /.well-known/acme-challenge/ { allow all; } } ``` 此配置参考了社区最佳实践,确保了多个域名共用同一证书以简化管理。 ### 3. 通配符证书(Wildcard) 如果子域名数量众多,建议使用泛域名证书,如 `*.your_domain`,只需 DNS-01 验证: ```bash sudo certbot certonly --nginx --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/cloudflare.ini -d your_domain -d "*.your_domain" ``` 这可一次性覆盖所有一级子域名,避免在添加新子域时重复执行命令citeturn0search3turn0search7。 ### 4. 针对大量域名的策略 - **每个 Server Block 单证书**:如果不同域名归属不同项目,推荐为每个 Server Block 签发独立证书,互不影响citeturn0search4。 - **合并证书**:若域名数量适中,统一补充 `-d` 参数管理多个名称,可减少证书请求次数,避开 Let’s Encrypt 对同一根域名的限额(50 次/周)citeturn0search4turn0search9。 - **自动化脚本**:可编写脚本遍历域名列表,批量生成或续期证书,并统一触发 `nginx reload`,提高运维效率citeturn0search6turn0search8。 完成以上配置后,您的单台服务器即可安全、稳定地为多域名与多子域名提供 HTTPS 服务,无需重复部署。
分享
×
用手机扫码分享
没有评论
请登陆后评论
新建评论
移除
关闭
提交