acme.sh 脚本出现验证超时的解决技巧

大家好,我是 33blog 的技术博主。今天想和大家分享一个在使用 acme.sh 申请 SSL 证书时经常遇到的问题——验证超时。这个问题困扰了我好几次,经过多次实践和调试,终于总结出了一些有效的解决方法。
什么是验证超时?
在使用 acme.sh 申请 Let’s Encrypt 证书时,脚本需要通过 HTTP 或 DNS 验证你对域名的控制权。如果验证过程在指定时间内没有完成,就会出现 “Timeout” 错误。这种情况在服务器网络环境复杂或者 DNS 解析较慢时特别常见。
方法一:增加超时时间
最简单的解决方法就是增加验证超时时间。acme.sh 默认的超时时间可能在某些网络环境下不够用。
# 设置更长的超时时间(单位:秒)
export ACME_HTTP_VERIFY_TIMEOUT=120
export ACME_DNS_VERIFY_TIMEOUT=300
# 然后正常执行证书申请
acme.sh --issue -d example.com -w /var/www/html
我在实际使用中发现,将 HTTP 验证超时设置为 120 秒,DNS 验证超时设置为 300 秒,基本能解决大部分网络延迟导致的超时问题。
方法二:检查网络连通性
验证超时很多时候是因为服务器到 Let’s Encrypt 服务器的网络连接有问题。
# 测试到 Let's Encrypt 服务器的连通性
ping acme-v02.api.letsencrypt.org
telnet acme-v02.api.letsencrypt.org 443
# 检查防火墙设置
iptables -L
# 确保 80 和 443 端口对 Let's Encrypt 服务器开放
有一次我遇到这个问题,发现是服务器的防火墙规则阻止了到 Let’s Encrypt 服务器的连接。检查网络连通性应该是排查的第一步。
方法三:使用 DNS 验证方式
如果 HTTP 验证一直超时,切换到 DNS 验证是个不错的选择,特别是对于有动态 IP 或者防火墙限制严格的服务器。
# 使用 DNS API 进行验证(以 Cloudflare 为例)
export CF_Key="your_cloudflare_api_key"
export CF_Email="your_email@example.com"
acme.sh --issue --dns dns_cf -d example.com -d *.example.com
DNS 验证的稳定性比 HTTP 验证好很多,因为不依赖服务器的网络环境。我在生产环境中现在基本都使用 DNS 验证方式。
方法四:更换 ACME 服务器
Let’s Encrypt 有多个服务器端点,如果某个服务器连接不稳定,可以尝试切换到其他服务器。
# 切换到 Let's Encrypt 的备用服务器
acme.sh --set-default-ca --server letsencrypt
# 或者使用 ZeroSSL
acme.sh --set-default-ca --server zerossl
有一次我在国内服务器上遇到持续超时,切换到 ZeroSSL 后问题就解决了。不同的 CA 服务器在不同地区的访问速度确实有差异。
方法五:检查域名解析
DNS 解析缓慢也会导致验证超时,确保你的域名解析正常且快速。
# 检查域名解析
nslookup example.com
dig example.com
# 检查 DNS 解析时间
time nslookup example.com
实战经验总结
经过多次踩坑,我的建议排查顺序是:先检查网络连通性,然后尝试增加超时时间,如果还不行就切换到 DNS 验证,最后考虑更换 ACME 服务器。大多数情况下,前两个方法就能解决问题。
希望这些技巧能帮助大家顺利解决 acme.sh 验证超时的问题。如果还有其他疑问,欢迎在评论区留言讨论!


终于找到解决办法了!之前卡超时搞了一晚上 😊