宝塔内置脚本续签最稳,使用/www/server/panel/pyenv/bin/python /www/server/panel/class/acme_v2.py --renew=1即可自动验证、换证、重载;需root权限、避免端口限制选DNS验证、加证书重载检查与日志。

直接用宝塔内置脚本续签最稳
宝塔面板从 7.7 版起就自带了可被定时调用的 ACME 续签入口,不需要额外装 acme.sh 或写复杂 API 调用。只要证书是通过面板申请的 Let’s Encrypt 类型,且验证方式(HTTP-01 或 DNS-01)仍有效,/www/server/panel/pyenv/bin/python /www/server/panel/class/acme_v2.py --renew=1 这条命令就能触发完整续签流程——包括验证、换证书、重载 Nginx/Apache。
常见错误现象:PermissionError: [Errno 13] Permission denied,说明没用 root 权限执行;或脚本返回 no domain found,代表该站点 SSL 配置异常(比如证书被手动删过、或域名配置被清空)。
- 执行周期建议设为每天凌晨 3:01(避开 Let’s Encrypt 的高峰请求时段)
- 任务用户必须选
root,否则无法读取私钥和写入证书目录 - 如果只续某个网站,可在命令末尾加
--domain=example.com,避免全量扫描拖慢速度 - 别用
python3替代面板自带的python,路径里那个pyenv是专为面板定制的运行环境,混用会导致模块找不到
DNS 验证比文件验证更适合自动续签
如果你的服务器 80 端口被 CDN、NAT 或防火墙挡住,或者要申请通配符证书(*.example.com),就必须用 DNS-01 验证。它不依赖 HTTP 访问,而是靠调用云厂商 DNS API 自动添加/删除 TXT 记录,整个过程完全后台化,对自动续签更友好。
使用场景:阿里云、腾讯云、华为云等主流 DNS 托管平台都支持,宝塔已内置对应接口。填对 AccessKey ID 和 AccessKey Secret 后,后续所有续签都会自动走 DNS 流程,无需人工干预。
- 阿里云需单独授予
AliyunDNSFullAccess权限,仅给ReadOnlyAccess会失败 - 旧 TXT 记录不清理会导致验证超时,宝塔一般能自动清理,但若手动改过记录,建议先在控制台清空所有
_acme-challenge开头的 TXT 条目 - 泛域名证书必须用 DNS 验证,文件验证不支持
*域名
计划任务里别漏掉证书重载检查
续签成功 ≠ HTTPS 立即生效。宝塔虽然会在续签后尝试重载 Web 服务,但某些情况下(比如 Nginx 配置语法错误、进程卡死)会导致 reload 失败,而脚本默认不报错退出,你会以为“续上了”,实际浏览器仍提示证书过期。
性能影响:加一次检查几乎无开销,但能避免半夜证书静默失效。
- 在计划任务脚本末尾追加:
nginx -t && systemctl reload nginx(Nginx 用户)或apachectl configtest && systemctl reload httpd(Apache 用户) - 把命令用
&&连接,确保只有前一步成功才执行下一步 - 加日志输出,例如:
echo "$(date): renew done" >> /var/log/bt-renew.log,方便排查哪天没跑成
证书路径和权限问题最容易被忽略
宝塔把证书存到 /www/server/panel/vhost/ssl/域名/ 下,但有些自定义脚本或反向代理(如 Nginx stream 模块、frp)会硬编码读取其他路径,导致续签后新证书根本没被加载。
兼容性影响:如果你在站点配置里用了「SSL 证书」下拉菜单以外的方式引用证书(比如在 Nginx 配置中写死绝对路径),续签后这些路径不会自动更新,必须手动改或用符号链接兜底。
- 确认所有服务都指向
fullchain.pem和privkey.pem,不是cert.pem或key.pem(后者是旧版命名) - 检查文件权限:
privkey.pem必须是600,且属主为root,否则 Nginx 启动会报SSL_CTX_use_PrivateKey_file failed - 如果用了 Docker 或独立 Nginx 实例,不要依赖面板自动重载,得自己加
inotifywait监听证书目录变更并触发 reload
自动续签不是设完就一劳永逸的事。最常出问题的环节永远在“验证是否真生效”——浏览器访问、curl 查证书有效期、看 Nginx error log,这三步缺一不可。尤其当服务器有多个 IP、多层代理或 SELinux 开启时,光看计划任务执行成功日志远远不够。










