
当你使用 ACME 协议设置或更新 SSL 证书时,经常会遇到一些令人费解的错误,导致整个过程停滞不前。本指南将向你介绍最常见的 ACME 相关问题,解释它们的实际含义,并告诉你如何准确地修复它们。无论你是要安装新证书、自动续费还是调试失败的验证,都可以从这里开始。
外部账户绑定缺失或无效
当 ACME 服务器需要外部账户绑定 (EAB),但您的客户端没有发送有效凭证或完全跳过凭证时,就会出现此错误。EAB 是证明您可以使用特定 ACME 服务器的一种方式。
如何解决
- 仔细检查您的密钥 ID 和 HMAC 密钥:确保两者都正确无误,并与提供的完全一致。无隐藏空格或换行。
- 使用正确的 ACME 目录 URL:有些客户端允许使用–server。不要混淆生产和暂存 URL。
- 添加 EAB 标志:如果您使用的是
acme.sh,标记应如下所示:–eab-kid –eab-hmac-key - 更新 ACME 客户端:如果客户端已经过时,请进行更新。新版本对 EAB 的支持更好。
账户不存在
当 ACME 客户端尝试使用 CA 无法识别的本地账户密钥(存储在其配置文件夹中的密钥)时,就会出现 urn:ietf:params:acme:error:accountDoesNotExist 错误。
简单地说,您的 ACME 客户端正在引用一个不存在或在 CA 端被删除的账户。在重新安装客户端、移动服务器或在暂存端点和生产端点之间切换时,这种情况很常见。
如何解决
1.重新注册 ACME 帐户:注册时请使用正确的外部账户绑定(EAB)凭据。
acme.sh 示例:
acme.sh --register-account \
--server https://acme.your-ca.com/v2/DV \
--eab-kid YOUR_EAB_KID \
--eab-hmac-key YOUR_EAB_HMAC_KEY \
--accountemail [email protected]
2.检查 ACME 服务器 URL:确保您注册的端点正确,与您的订单相符。
3.避免重复使用账户文件:不要在服务器或客户端之间移动account.conf或账户密钥,除非你 100%确定它们对同一 CA 和环境有效。
错误的 Nonce 或防重放错误
您的 ACME 客户端使用已被使用、过期或无效的 nonce(来自 CA 的一次性令牌)发送了一个请求。服务器会阻止它以防止重放攻击。urn:ietf:params:acme:error:badNonce通常是一个临时问题,由时间不对,请求延迟或时钟不匹配引起。
如何解决
1.重试请求:大多数 ACME 客户端(如 acme.sh)会在出现badNonce 错误时自动重试。如果没有,请手动重新运行最后一条命令。第二次尝试应该就能成功。
2.同步服务器时钟:系统时间偏差会导致重放错误。 运行:
timedatectl status
timedatectl set-ntp true
或确保ntpd 或chronyd 运行正常。
3.检查代理或 CDN 是否延迟:如果您使用的是 Cloudflare、负载平衡器或速度较慢的代理,它可能会延迟您的请求,以至于使 nonce 失效。试着暂时绕过它。
请求的标识符尚未授权
当出现 urn:ietf:params:acme:error:rejectedIdentifier 错误时,ACME 服务器拒绝了您尝试验证的一个或多个域名。通常是因为
- 域名不存在于公共 DNS 中
- 没有指向您服务器的 DNS 记录
- 域名未获授权签发证书
简而言之,CA 无法验证您是否拥有或控制该域。
如何解决
1.在命令中使用正确的格式:只包含域名,不包含协议、斜线或完整的 URL。
- 正确: -d example.com
- 错误: -d http://example.com
2.检查域名是否存在并已解析。 运行:
dig example.com +short
如果没有输出,说明域名尚未启用,请先修复 DNS 设置。
2.匹配你的 ACME 订单:如果您使用的是商业 ACME 证书,请确保您签发的域名列在原始订单上。您不能随意添加域名。必须事先获得批准。
3.注意错别字和子域混淆:仔细检查www.example.comvsexample.com 等内容。这些内容将作为单独条目处理。
未经授权或无效响应
证书颁发机构无法验证您的域名所有权。最常见的情况是,它无法访问客户放在服务器上的 ACME 挑战文件。这是 HTTP 验证问题:证书颁发机构试图访问您的网站,但无法找到或读取挑战文件。
确切的错误信息是 urn:ietf:params:acme:error:unauthorized。也可能显示为“来自 http://yourdomain.com/.well-known/acme-challenge/ 的无效响应……”。
如何解决
- 确保您的服务器可通过 80 端口连接(即使您的网站通常重定向到 HTTPS)。
- 仔细检查 ACME 客户端配置中的 webroot 路径。挑战文件必须写入/.owned/acme-challenge/。
- 如果服务器强制 HTTPS 重定向,则暂时允许该路径的纯 HTTP 请求。
- 禁用可能干扰 CA 外部 HTTP 验证的 CDN、反向代理或防火墙。
- 检查文件权限,确认挑战文件确实正在创建并可公开访问。
未找到令牌或无法访问文件(404 或 403)
ACME 服务器尝试获取 HTTP 挑战文件,但得到了 404(未找到)或 403(禁止)响应。这意味着该文件要么没有正确放置,要么不能公开访问,要么你的网络服务器阻止了访问。
确切的错误信息可能会有所不同。以下是您可能会看到的内容:
- 来自 http://yourdomain.com/.well-known/acme-challenge/… [404] 的无效响应
- 无效响应……[403 禁止]
- urn:ietf:params:acme:error:unauthorized
如何解决
检查域的文档根目录,确保与 ACME 客户端放置文件的位置一致:/.well-known/acme-challenge/
确认令牌文件存在,并且可以通过浏览器访问。您应该能在浏览器中直接打开挑战 URL 并看到令牌内容。
设置正确的文件权限:ACME 挑战文件及其父文件夹必须是世界可读的。
如果您使用 .htaccess 规则、防火墙或安全插件(如 WordPress),请确保它们没有阻止访问 /.well-known/ 路径。
如果收到 403,也请检查文件所有权和 SELinux/AppArmor 限制(如适用)。
CAA 记录禁止发布
您的 DNS 有一个CAA 记录,用于限制哪些证书颁发机构可以为您的域名颁发证书。如果您要使用的 CA 未在列表中,默认情况下它们会被阻止。您可能会看到以下错误信息: urn:ietf:params:acme:error:caa
这是 DNS 层的政策,不是服务器的问题。CA 必须在签发任何证书前检查 CAA。
如何解决
检查域名的 DNS 区域是否有 CAA 记录。您可以使用在线工具或 dig 命令:
dig CAA yourdomain.com
如果没有 CAA 记录,任何 CA 都可以签发。但如果有 CAA 记录,请确保其中包含证书提供者的确切名称,如
- 0 期 “sectigo.com”
- 0 问题 “digicert.com”
如果使用通配符证书,还需添加 issuewild 一行:0 issuewild “sectigo.com”
等待几分钟等待 DNS 传播,然后重试 ACME 订单。如果您不确定,可以暂时删除 CAA 记录以测试签发,但前提是您必须安全地管理 DNS。
TXT 记录未找到(用于通配符证书)
通配符证书(如*.example.com)需要 DNS-01 验证,这是所有 CA 允许用于通配符域的唯一方法。
DNS-01 的工作原理是要求您在 DNS 中创建一个特殊的 TXT 记录:_acme-challenge.example.com
如果该记录丢失或尚未传播,则会出现此错误。
错误示例
- urn:ietf:params:acme:error:dns ::DNS problem: NXDOMAIN looking up TXT for _acme-challenge.example.com
- 未找到 _acme-challenge.example.com 的 TXT 记录
如何解决
在 DNS 提供商中创建 TXT 记录:
- 名称:_acme-challenge.example.com
- 值:(ACME 客户端提供给您的令牌;每次请求都是唯一的)
等待 DNS 传播 1-10 分钟。有些提供商需要更长的时间。使用以下命令确认。
dig TXT _acme-challenge.example.com
您也可以使用在线 DNS 查询工具。一旦可见,请重试验证。
请求过多或超出速率限制
当 ACME 服务器因您已达到速率限制而拒绝处理您的请求时,该错误会显示为 urn:ietf:params:acme:error:rateLimited或429 太多请求。
这种情况通常发生在短时间内为同一域名申请过多证书或连续发送过多失败请求时。
如何解决
大多数速率限制都会在一小时、一天或一周后自动重置,具体取决于你碰到了什么问题。如果使用脚本,请在重试前检查日志并修复错误。不要盲目蛮干,这样只会加重锁定。
对于 DNS-01 验证,应避免在 TXT 记录出现小错误后快速重新请求。等待 DNS 传播。如果您的 CA 提供速率限制状态页面或标题,请查看这些页面以了解更精确的重置时间。
DNS 错误或查找失败
如果收到类似“DNS problem: NXDOMAIN looking up A for example.com“或“Temporary failure in name resolution“的信息,这意味着 ACME 服务器无法解析您的域名,原因可能是域名不存在、尚未传播或没有有效的 IP 记录。
证书颁发机构依靠 DNS 来验证您的域名是否存在并指向真实的地方。如果它无法访问您的 A(IPv4)或 AAAA(IPv6)记录,就会停止验证过程。
这种情况可能发生在以下情况
- 您的域名是全新的,DNS 尚未完全传播
- 您忘记添加正确的 DNS 记录
- 您在本地或内部网络中工作,没有公共 DNS 可见性
- 您提交的域名中有一个错别字
如何解决
- 仔细检查您的域名是否有有效的 A 或 AAAA 记录指向您的实时服务器。
- 使用dig、nslookup 或在线检查工具(如whatsmydns.net)等工具确认传播情况。
- 请确保您使用的不是专用域或内部专用域。ACME 验证仅适用于可公开解析的名称。
- DNS 更改后请等待几分钟,因为它们并不总是立即生效。
无法连接 ACME 服务器
当服务器无法到达 ACME API 端点时会出现此错误。根据 ACME 客户端的不同,它可能显示为 “拒绝连接“、”连接超时“、”无法连接“或类似信息。
如何解决
- 确保服务器允许通过 443 端口进行 HTTPS 连接。
- 检查防火墙设置或出站网络规则(尤其是在云/VPS 设置中)。
- 如果使用代理服务器,请允许访问 CA 的 ACME 服务器域。
- 确认服务器的 DNS 解析器正常工作。
- 使用:curl https://acme.example.com(用 CA 的真实端点代替)测试连接性。
- 解决网络问题后,重新启动 ACME 客户端。
续订后脚本失败
在证书更新成功后,如果重新加载网络服务器或服务的后续脚本没有正常运行,就会出现这个错误。根据你的 ACME 客户端,你可能会看到 “post-hook error”(挂钩后错误)、”deploy script failed”(部署脚本失败)或 “command not found”(未找到命令)等信息。
如何解决
- 手动运行续订后脚本,看看有什么问题。
- 检查文件路径,尤其是新证书和密钥的路径。
- 确保脚本具有执行权限(例如,chmod +x script.sh)。
- 查找错别字、丢失的依赖项或错误的命令语法。
- 如果使用部署钩子或后置钩子,请确认客户端是否支持该钩子,并且配置是否正确。
最后的话
我们介绍了最常见的 ACMS SSL 证书错误,并给出了快速修复方法。如果这些都不能解决问题,请在调试模式下运行 ACME 客户端。启用日志记录后,大多数客户端都会提供更详细的输出。这些信息可以帮助确定真正的原因,并让你的 SSL 重新正常工作。

