certbot 是什么
certbot 是 EFF 出品的 ACME 协议客户端,用于向 Let's Encrypt 等 CA 自动申请、续期与吊销免费证书。它支持 Nginx/Apache 插件自动改配置,也支持 webroot、standalone、dns-01 等验证方式;申请完成后由系统自带的 systemd timer(或 cron)定期执行 certbot renew 完成续期。
基本信息
| 适用平台 | Linux 各发行版(CentOS/RHEL、Ubuntu/Debian) |
|---|---|
| 安装方式 | 系统包管理器、pip、snap |
| 配置目录 | /etc/letsencrypt/,证书在 live/<name>/ 下 |
| 证书文件 | cert.pem、chain.pem、fullchain.pem、privkey.pem |
| 自动续期 | systemd timer 或 cron 调用 certbot renew |
| 权限 | 需 root 或可写 /etc/letsencrypt 与 Web 根目录 |
典型使用场景
- 给新站点一键签发证书并让插件自动写入 Nginx 配置
- 给已有 Web 服务补证书,只申请文件不碰现有配置
- 给泛域名签发证书(必须走 DNS 验证)
- 续期演练与到期日核对,避免线上突然过期
- 证书迁移或重建时列出、吊销、删除指定证书
高频命令
高频命令
# 首次申请:Nginx 插件会自动改配置并 reload
certbot --nginx -d example.com -d www.example.com
# 只签证书不改配置(webroot 方式)
certbot certonly --webroot -w /var/www/html -d example.com
# 泛域名必须用 DNS 验证
certbot certonly --manual --preferred-challenges dns -d '*.example.com'
certbot certificates # 列出已管理证书与剩余天数
certbot renew --dry-run # 演练全部续期,不触碰线上
certbot renew --deploy-hook 'systemctl reload nginx' # 续期成功后重载服务
openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -enddate验证方式对比
| 方式 | 适用场景 | 注意点 |
|---|---|---|
| nginx/apache 插件 | 服务器可控,希望自动改配置 | 会改写 server 块,改前先备份配置 |
| webroot | 已有 Web 服务占用 80 端口 | 需保证 .well-known 路径外网可达 |
| standalone | 机器上没有 Web 服务 | 验证期间独占 80/443,需临时停服 |
| dns-01 | 泛域名、内网机器无法暴露 80 | 需 DNS API 凭据或手工添加 TXT 记录 |
续期成功但服务没重载,等于线上仍在用旧证书:必须配置 --deploy-hook,或让服务统一引用 /etc/letsencrypt/live/<name>/ 下的文件并定期 reload。
正式环境先跑 certbot renew --dry-run。Let's Encrypt 有速率限制(同域名每周签发数与重复证书数都有上限),反复试验会触发限流,影响真实签发。
常见报错与处理
- Challenge failed / Invalid response:http-01 挑战路径外网不可达,检查安全组、防火墙与 Web 服务是否放行 80
- Too many certificates already issued:触发速率限制,等待窗口期恢复后再试,不要反复重试加重计数
- Problem binding to port 80:standalone 模式与正在运行的 Web 服务抢端口,先停服或改用 webroot 方式
- Certificate not yet due for renewal:证书未进入 30 天窗口,renew 主动跳过,这是正常行为而非故障
- 续期任务没跑:确认 systemctl list-timers 里 certbot.timer 存在,并翻看 /var/log/letsencrypt/letsencrypt.log 的错误行