使用ACME和Cloudflare续期SSL证书时遇“无权访问资源”错误
解决ACME + Cloudflare续期SSL时的9109权限错误与TXT记录添加失败
错误本质
报错里的Cloudflare API错误码9109明确表示使用的API凭证没有访问目标域名资源的权限,invalid domain和TXT记录添加失败都是权限问题引发的连锁反应。
排查与修复步骤
1. 定位ACME的Cloudflare配置文件
acme.sh会为每个域名单独存储配置,先找到目标域名的配置目录:
cd /root/.acme.sh/<你的域名>/
目录内的配置文件(如cf.ini或含环境变量的脚本)存储了Cloudflare的API凭证和Zone信息,先核对这些参数是否正确。
2. 检查Cloudflare API凭证权限
- 若使用API令牌(推荐):
登录Cloudflare后台,进入「个人资料」→「API令牌」,找到对应令牌:- 确认令牌已开启
Zone.DNS的编辑权限 - 确认令牌的资源范围包含目标域名的Zone(需明确指定,而非泛选无权限的「所有区域」)
- 确认令牌已开启
- 若使用全局API密钥:
确认该密钥对应的Cloudflare账号拥有目标域名的管理权限(是域名所有者或有权限的成员)
3. 手动验证API权限
用curl直接调用Cloudflare API验证权限,排除ACME配置问题:
# API令牌验证示例 curl -X GET "https://api.cloudflare.com/client/v4/zones/<你的Zone ID>/dns_records" \ -H "Authorization: Bearer <你的API令牌>" \ -H "Content-Type: application/json" # 全局密钥验证示例 curl -X GET "https://api.cloudflare.com/client/v4/zones/<你的Zone ID>/dns_records" \ -H "X-Auth-Email: <你的Cloudflare登录邮箱>" \ -H "X-Auth-Key: <你的全局API密钥>" \ -H "Content-Type: application/json"
返回success: true说明权限正常;若仍返回9109错误,直接去Cloudflare调整凭证权限。
4. 重新配置ACME并续期
若凭证正确但ACME配置未生效,手动设置环境变量后重新触发续期:
# API令牌场景 export CF_API_TOKEN="你的有效API令牌" export CF_ZONE_ID="目标域名的Zone ID" /root/.acme.sh/acme.sh --renew -d <你的域名> --dns dns_cf # 全局密钥场景 export CF_Email="你的Cloudflare登录邮箱" export CF_Key="你的全局API密钥" /root/.acme.sh/acme.sh --renew -d <你的域名> --dns dns_cf
5. 确认域名正确性
检查_acme-challenge.<你的域名>中的主域名是否拼写正确,且确实在当前Cloudflare账号的管理范围内。
内容的提问来源于stack exchange,提问作者Kevin.B
相关产品推荐
相关产品推荐

