Golang实现ACMEv2 HTTP-01挑战时ACME服务器未发起验证求助
ACMEv2 HTTP-01挑战未触发验证的排查方向
问题背景
我通过一段代码手动完成ACMEv2 HTTP-01挑战流程,所有请求都返回201/200响应,挑战创建成功,但ACME服务器始终未向我的HTTP服务器发起验证请求。向挑战URL发送POST请求返回成功:
2022/07/17 13:49:28 challenge response { "type": "http-01", "status": "pending", "url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/3039193714/PVI-4A", "token": "yoevDKY_bARdM5uHmVsk3s5lPK8BsBWC-SfmRN8MkLM" }
但轮询授权状态时始终显示pending:
2022/07/17 13:49:43 authorization response { "identifier": { "type": "dns", "value": "billabull.com" }, "status": "pending", "expires": "2022-07-24T13:49:27Z", "challenges": [ { "type": "http-01", "status": "pending", "url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/3039193714/PVI-4A", "token": "yoevDKY_bARdM5uHmVsk3s5lPK8BsBWC-SfmRN8MkLM" }, { "type": "dns-01", "status": "pending", "url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/3039193714/uHeVHQ", "token": "yoevDKY_bARdM5uHmVsk3s5lPK8BsBWC-SfmRN8MkLM" }, { "type": "tls-alpn-01", "status": "pending", "url": "https://acme-staging-v02.api.letsencrypt.org/acme/chall-v3/3039193714/RomB0g", "token": "yoevDKY_bARdM5uHmVsk3s5lPK8BsBWC-SfmRN8MkLM" } ] }
已设置2分钟轮询超时,且测试确认billabull.com的80端口HTTP服务器可正常访问,挑战路径能返回正确的密钥授权,但ACME服务器从未发起请求。
可能的原因及排查步骤
1. 未正确触发挑战验证
ACME协议中,创建挑战后必须向挑战的URL发送POST请求来告知服务器开始验证,仅创建挑战不会自动触发验证流程。确认代码中是否在创建挑战后,向返回的url字段发起了包含正确签名的POST请求,且请求返回200/202状态码。
2. 密钥授权内容错误
虽然测试挑战路径能返回内容,但需严格确认返回格式:
- 密钥授权必须是
{token}.{JWK thumbprint}格式 - JWK thumbprint需使用SHA-256哈希,且采用Base64URL编码(不含填充字符)
- 确保返回内容无多余空格、换行或其他字符,ACME服务器对内容匹配要求严格
3. DNS解析问题
- 确认ACME服务器所在网络能正确解析
billabull.com到你的服务器IP,可测试全球DNS解析同步状态(部分服务商TTL设置可能导致延迟) - 检查是否存在CNAME记录指向其他域名,确保最终解析IP为你的HTTP服务器IP
4. 防火墙/网络拦截
- 确保服务器80端口对所有IP开放(Let's Encrypt验证服务器IP段动态变化,不能仅放行单个IP)
- 检查安全组、防火墙规则(如iptables、ufw)或WAF是否拦截了ACME的验证请求
- 确认网络中无NAT或代理导致请求无法到达HTTP服务器
5. HTTP服务器配置问题
- 确认HTTP服务器处理
/.well-known/acme-challenge/{token}路径时,没有重定向到HTTPS(HTTP-01挑战要求通过80端口的HTTP协议,重定向会导致验证失败或不触发) - 检查返回的Content-Type是否为
text/plain,部分服务器默认返回text/html会导致ACME服务器无法识别 - 确保该路径未设置身份验证或其他访问限制
6. ACME挑战状态同步延迟
Staging环境可能存在状态同步延迟,可尝试延长轮询时间(如5分钟),同时检查ACME服务器返回的授权对象中是否隐藏了error字段
内容的提问来源于stack exchange,提问作者danthegoodman
相关产品推荐
相关产品推荐

