排错与最佳实践
目标:遇到报错能快速定位,掌握安全、限速、备份等生产要点。
1. 排错总原则
- 看日志:
sudo tail -n 100 /var/log/letsencrypt/letsencrypt.log - 用
--dry-run复现,避免反复失败触发限速。 - 复杂调试用 staging(
--test-cert),成功后再上生产。
2. 常见错误与解决
| 现象 / 报错关键词 | 常见原因 | 解决办法 |
|---|---|---|
Connection refused / timeout(HTTP-01) | 80 端口不通、防火墙、域名未解析 | 开放 80;dig +short 域名 核对解析;ss -tlnp 看端口 |
Invalid response from ... 404/403 | webroot 目录不对、Web 服务器拦截 /.well-known/ | 核对 -w 目录与 server root;放行该路径 |
No valid IP addresses found | 域名没解析到本机公网 IP | 检查 DNS A/AAAA 记录并等 TTL 生效 |
too many failed authorizations | 验证失败次数达到每小时上限(5 次/账户/主机名) | 停止重试,等 1 小时;先 --dry-run 修好再跑 |
too many certificates already issued | 同一组域名重复签发达到周上限(5 次/周) | 用 --cert-name 复用续期而非反复重签;等待或减少重签 |
Error creating new order :: too many certificates | 注册域名周上限(约 50 张/周) | 规划域名、合并 SAN、等待下一周 |
No installers seem to be present | 没装 nginx/apache 插件,或服务未安装 | certbot plugins 查看;装 python3-certbot-nginx |
Problem binding to port 80 | standalone 时 80 被占用 | 先停服务或用 --pre-hook 停、--post-hook 启 |
DNS problem: NXDOMAIN(DNS-01) | TXT 记录没生效/加错位置 | 等 DNS 传播;核对 _acme-challenge 前缀 |
urn:ietf:params:acme:error:rateLimited | 触发 CA 限速 | 看具体类型,等待或换 staging |
| 私钥权限告警 | privkey.pem 权限过宽 | chmod 600 privkey.pem |
ACME 错误码(
urn:ietf:params:acme:error:*)可直接在 Let's Encrypt 文档里查含义。
3. Let's Encrypt 限速(重要,务必了解)
| 限制项 | 大致额度 | 说明 |
|---|---|---|
| 证书数 / 注册域名 | 50 张 / 周 | 所有证书(含续期)按"注册域名"统计 |
| 重复证书(完全相同的域名集合) | 5 张 / 周 | 频繁重签同组域名会撞上 |
| 验证失败 | 5 次 / 账户 / 主机名 / 小时 | 反复调试最容易撞这个 |
| 待处理授权 | 300 / 账户 | 大量并发签发时注意 |
应对:测试用 staging(几乎不限速);正式签发前 --dry-run;失败后停手等冷却;续期不是"重新签发",正常不占重复证书额度(但计入 50/周 的注册域名额度)。
官方最新数值以 https://letsencrypt.org/docs/rate-limits/ 为准。
4. 安全最佳实践
- 私钥最小权限:
privkey.pem设chmod 600,属主 root。 - 私钥泄露立即处理:
certbot revoke撤销 + 重新签发 + 排查泄露点。 - 账号密钥别乱删:
/etc/letsencrypt/accounts/删除会生成新账号,影响续期关联。 - 启用 HSTS / OCSP(nginx/apache 插件):
--hsts --staple-ocsp。 - 定期备份:
/etc/letsencrypt整体加密备份(见 配置与文件布局)。 - 限制 SSH/面板访问:能读
/etc/letsencrypt的人等于能拿到私钥。
5. 运维检查清单
bash
# 1) 证书是否都在有效期内、还剩多久
sudo certbot certificates
# 2) 续期定时器是否在跑
systemctl list-timers --all | grep -i certbot
# 3) 续期演练是否通过(建议纳入日常监控/CI)
sudo certbot renew --dry-run
# 4) 线上 HTTPS 证书链是否完整、到期时间
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -dates -subject -issuer6. 一条命令排错定位
bash
# 完整流程演练 + 详细输出
sudo certbot renew --dry-run -v
# -v / -vv 提高日志详细度,定位失败的具体步骤7. 参考链接
- Certbot 官方文档:https://eff-certbot.readthedocs.io/
- 安装向导(按发行版选择):https://certbot.eff.org/instructions
- Let's Encrypt 限速:https://letsencrypt.org/docs/rate-limits/
- Let's Encrypt 社区求助:https://community.letsencrypt.org/
