apizone 看笔记

国内服务器签发免费证书反复超时

ACME 接口时通时不通,问题从来不在配置里。

给一台内存吃紧的小服务器配 HTTPS 时,证书签发连续两次超时,第三次却一次成功。问题不在配置,在网络路径:国内机房直连国际 CA 的 ACME 接口时通时不通。这篇记录排查过程和结论。

症状很容易误判成配置错误

客户端报的是读取超时,不是拒绝连接,也不是校验失败。这类错误的迷惑性在于:它可能压根没走到业务逻辑层,只是 TCP 之上那层握手或响应没回来。此时反复改配置毫无意义,第一步应该是单独测连通性:

curl -s -o /dev/null -w '%{http_code} %{time_total}s\n' \
  --max-time 20 https://<ca-acme-endpoint>/directory

第一次测的时候读超时,隔了半天再测是 0.7 秒返回 200。同一个出口、同一份配置,结果完全不同——这就排除了本机配置问题,指向链路质量。

为什么会时通时不通

  • 国际 CA 的接口节点通常在海外,跨境链路本身抖动大,晚高峰更容易丢包。
  • 部分云厂商出口对境外地址有速率限制或连接数限制,突发请求会被悄悄丢弃。
  • HTTP 客户端默认超时偏短(常见 30–45 秒),刚好卡在抖动的临界点上,于是表现为随机失败。

三条应对策略

先复测,再换方案。签发类操作有副作用(多数 CA 对失败重试次数有配额限制),不要一失败就猛点。间隔一段时间手动复测一次连通性,通了立刻签。

备选一是 DNS-01 验证。不走 HTTP 回连,改为在域名解析里加一条 TXT 记录由 CA 查询,绕开出站链路的依赖。代价是需要调用 DNS 服务商的 API,首次配置麻烦,但稳定性最好,也天然支持泛域名。

备选二是换 CA 或换接入方式。不同 CA 的接口节点分布不同,一个不通另一个往往能通;部分地区也有本地签发的免费证书可选。

签完必须验的两件事

证书装上不等于结束。自动化续期才是长期成本所在:

# 演练续期(不会真的替换线上证书)
certbot renew --dry-run
# 确认定时器在工作
systemctl list-timers | grep certbot

演练输出里每张证书都显示 success,才算闭环。否则九十天后证书过期,网站在浏览器里变成红色警告,而那时你已经忘了当初怎么签的。

超时报错的第一反应不该是改配置,而是问一句:这个请求真的到达对方了吗?