结论:acme.sh + --cron + --reloadcmd 这套思路是对的,但真正会让续期「看着成功、实际没生效」的,通常是 cron 环境和 reloadcmd,而不是签发本身。

第一,cron 里的 PATH 跟你 SSH 登录时不一样。 nginx -s reload 手动执行没问题,塞进 crontab 就可能 command not found。reloadcmd 里直接写绝对路径,比如 /www/server/nginx/sbin/nginx -s reload,或者 /etc/init.d/nginx reload,稳一点。

第二,证书路径别自己另起一个目录。 小皮面板「网站 → SSL」里显示的 key / pem 路径,才是它真正读取的位置,--install-cert 的 --key-file、--fullchain-file 就照抄这两个路径。自己搞个 /www/ssl/ 放证书,面板配置没跟着改,重载多少次还是旧证书。

第三,webroot 校验要求 80 端口能被访问。 站点挂了 CDN、开了强制 HTTPS 跳转、或者解析还没生效,验证都会失败。这种情况换 DNS 方式签发更省事。

补充两点:acme.sh 现在默认走 ZeroSSL,首次需要注册邮箱,嫌麻烦可以加 --server letsencrypt;另外别面板里签一份、acme.sh 又签一份,两套 key 对不上时排查很痛苦。

Windows 版小皮没有 crontab,得靠任务计划程序,这块我没实测过,你如果是 Windows 环境,建议把面板版本贴出来再讨论。