现场是这样的。证书到期前 acme.sh 自动续期失败,日志里报 InvalidAccessKeyId.NotFound,之前一直正常,最近只改过 RAM 子账号的权限。
中间走过弯路,把「环境变量里同时存在两套密钥,脚本读到了旧的那份」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。续期用的 AccessKey 属于被禁用的子账号,密钥已失效;RAM 子账号没有 AliyunDNSFullAccess,调 DNS 接口被拒;域名托管在另一家 DNS 服务商,插件却配成了阿里云。
第一件事是看续期日志里的具体报错码
grep -iE 'error|Invalid' ~/.acme.sh/acme.sh.log | tail -20
接着确认环境变量里的密钥是哪一套
env | grep -i -E 'Ali_Key|Ali_Secret' | sed 's/=.*/=***/'
然后换成有 DNS 权限的密钥再试签发
Ali_Key=xxx Ali_Secret=yyy acme.sh --issue --dns dns_ali -d demo.lu0.cn --force
剩下的就是确认证书已经更新并重载服务
acme.sh --list && systemctl reload nginx
怎么算真的好了,看的是同一批现象。acme.sh --list 里该域名的 Next renew 时间往后推了六十天,证书文件的修改时间是当天,浏览器访问证书有效期同步更新。
提醒一点。密钥别写进脚本和仓库,放 ~/.acme.sh/account.conf 并收紧到 600;换服务商时插件和 API 凭据要一起改,否则报错会指向密钥而不是插件。这类问题最好一次改到位,反复小改反而容易把原因搅混。
