小皮面板里点出来的 Let's Encrypt 证书默认不会自动续期,想要一次配置、长期免维护,正确做法是让 acme.sh 接管签发和续期,再用系统的定时任务每天跑一次 --cron,续期后通过 --reloadcmd 把新证书写回面板使用的路径并重载 Web 服务。
小皮面板的 SSL 证书会自动续期吗?
结论:面板里手动申请的 Let's Encrypt 证书有效期为 90 天,不额外配置定时任务就不会自己续,到期后浏览器直接报「证书已过期」,网站 HTTPS 打不开。
Let's Encrypt 的免费证书从 2020 年起统一是 90 天有效期,不是一年。小皮面板帮你完成的是「签发 + 写入证书路径」这一步,续期属于额外动作。Linux 版面板可以自己加计划任务,Windows 版面板没有 crontab,走的是系统任务计划程序,两条路径不一样。
判断方式很简单:登录服务器执行 crontab -l,如果输出里没有包含 .acme.sh/acme.sh --cron 的行,那就说明当前没有任何自动续期机制在跑。
用 acme.sh 给小皮面板配置自动续期的步骤
结论:acme.sh 在安装那一刻就会自动写入一条每天执行的 crontab,你只需要把「签发」和「安装证书」两步做对,续期就是全自动的。
第一步,安装 acme.sh(用 www.gj0.com 举例):
curl https://get.acme.sh | sh -s email=admin@www.gj0.com
安装完成后,脚本会往 crontab 里塞一行定时任务,默认每天 0 点检查一次证书剩余有效期,进入续期窗口就自动重新签发。
第二步,签发证书,路径填面板里该网站的真实根目录:
~/.acme.sh/acme.sh --issue -d www.gj0.com -d gj0.com --webroot /www/wwwroot/gj0.com
第三步,安装证书到面板读取的位置:
~/.acme.sh/acme.sh --install-cert -d www.gj0.com \
--key-file /www/ssl/www.gj0.com.key \
--fullchain-file /www/ssl/www.gj0.com.pem \
--reloadcmd "nginx -s reload"
--install-cert 这一步才是自动续期的关键:它把证书路径和「续期后要执行的命令」记在 acme.sh 的配置里,之后每次自动续期都会重新拷贝文件并触发 reloadcmd。
第四步,验证:执行 crontab -l | grep acme,能看到任务行就说明配置成功。
续期成功后为什么网站还是显示旧证书?
结论:证书文件被替换不等于面板生效,必须让 Web 服务重新加载配置,否则进程内存里还是旧证书。
--reloadcmd 就是解决这个问题的。nginx 写 nginx -s reload,Apache 写 httpd -s reload 或 systemctl reload httpd,小皮面板集成的服务名以面板实际安装的为准。
另外要确认 acme.sh 输出证书的目录,和小皮面板「网站 → SSL」里填的证书路径完全一致,文件名大小写也要对上,.key 和 .pem 是两个独立字段,不要填反。
配置自动续期容易踩哪些坑?
结论:绝大多数续期失败都出在 80 端口不通、路径填错、重复签发这三件事上。
- 80 端口必须对公网开放。HTTP-01 验证走的就是 80 端口,如果做了强制 HTTPS 跳转,要保证
/.well-known/acme-challenge/ 目录不被跳转拦截。
- 不要同时在面板和 acme.sh 里申请同一张证书。两套机制会互相覆盖文件,导致
reloadcmd 拿到的是过期内容。
- 选 DNS 验证更稳。如果服务器 80 端口常年占用,改用
--dns dns_ali 之类的 DNS API 验证,就不依赖端口了。
- Windows 版小皮面板没有 crontab。acme.sh 在 Windows 上依赖 Git Bash 或 WSL,配置成本较高;更省事的是用 win-acme,把导出的证书目录直接指向面板的证书路径,再挂一个 Windows 任务计划程序每天触发一次。
总结
自动续期的本质是把「签发 — 安装 — 重载」三件事交给 acme.sh 的定时任务:安装脚本时自动写入 crontab,--install-cert 记住证书路径和 reload 命令,剩下的 90 天周期它自己处理。你只需要保证 80 端口可达、证书路径和面板里填的一致,然后用 crontab -l 确认任务确实存在。