acme.sh调用阿里云DNS API必须使用ALIYUN_ACCESS_KEY和ALIYUN_ACCESS_KEY_SECRET环境变量,泛域名证书需同时指定-d example.com和-d *.example.com,且子账号须精确授予Alidns增删改查权限。

acme.sh 调用阿里云 DNS API 必须设对环境变量名
acme.sh 对不同 DNS 服务商使用固定命名的环境变量,阿里云只认 ALIYUN_ACCESS_KEY 和 ALIYUN_ACCESS_KEY_SECRET ——不是 Ali_Key、Ali_Secret,也不是文档里偶尔出现的 ACS_ACCESS_KEY_ID。设错就直接报 dns_ali: Aliyun api error 或静默跳过验证。
实际操作建议:
- 在执行命令前,用
export ALIYUN_ACCESS_KEY="xxx"和export ALIYUN_ACCESS_KEY_SECRET="yyy"显式导出(别写进~/.bashrc长期生效,避免泄露) - 运行
env | grep ALIYUN确认变量已加载 - 若用宝塔面板调用,必须在面板「DNS API 设置」里填入这两项,不能靠服务器全局环境变量
泛域名证书必须同时指定主域和通配符域名
申请 *.example.com 时,--issue 命令里不加 -d example.com 会导致证书链不完整:浏览器可能提示“证书不匹配”,因为 Let’s Encrypt 要求泛域名证书必须包含其基础域(即 naked domain)作为 Subject Alternative Name。
正确写法是:
~/.acme.sh/acme.sh --issue --dns dns_ali -d example.com -d *.example.com
注意点:
- 两个
-d参数顺序无关,但缺一不可 - 如果只要
www.example.com和example.com,就不需要dns_ali,HTTP 验证更简单 - 泛域名不支持二级以上通配,
*.dev.example.com是合法的,*.*.example.com不被 Let’s Encrypt 接受
自动续期后证书文件不会自动重载到 Nginx/Apache
--install-cert 只负责把证书文件拷贝到指定路径,它不触发服务重载。如果你没配 --reloadcmd,续期完成但网站仍用旧证书,直到你手动 nginx -s reload 或重启服务。
推荐做法:
- 部署时明确加上重载命令,例如:
--reloadcmd "systemctl reload nginx" - 宝塔用户应指向其内置脚本:
--reloadcmd "/etc/init.d/nginx reload"(路径以实际为准) - 若用
--install-cert单独部署,务必确认目标路径与 Web 服务器配置中ssl_certificate指向一致,否则续期只是“写了个寂寞”
阿里云 RAM 子账号权限必须精确到 DNS API
主账号 AccessKey 虽然能用,但存在严重安全风险。子账号必须至少拥有 Alidns:DescribeDomainRecords、Alidns:AddDomainRecord、Alidns:UpdateDomainRecord、Alidns:DeleteDomainRecord 四个权限。仅给 AliyunDNSFullAccess 策略会过度授权,而漏掉 DeleteDomainRecord 会导致续期失败——因为 acme.sh 每次验证前会先清理旧的 _acme-challenge 记录。
检查方式:
- 登录 RAM 控制台 → 用户 → 对应子用户 → 权限策略 → 查看策略内容
- 测试时可临时加
"Action": ["alidns:*"]验证是否是权限问题 - 错误日志中若出现
Forbidden.RAM或InvalidAccessKeyId.NotFound,优先查子账号状态和策略绑定
真正卡住人的地方,往往不是命令写错,而是阿里云 RAM 权限粒度太细、acme.sh 环境变量名太死板、或者以为“续上了=生效了”。每一步都得盯着日志里那句 success 出现在哪里——是在 DNS 记录添加后?还是在 --install-cert 执行完?抑或 --reloadcmd 返回 0?漏掉任意一环,HTTPS 就只是看起来很美。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











