一、为什么要自动续签 SSL 证书?
Let's Encrypt 提供的免费 SSL 证书有效期只有 90 天,如果忘记续签,网站就会弹出"不安全"警告,访客直接吓跑。手动续签不仅麻烦,还容易忘,所以自动化续签是刚需。
好消息是,宝塔面板已经内置了续签脚本,只需要配置一个定时任务,就能实现全程无人值守的证书更新。
二、前提条件
- 证书是通过宝塔面板 → 网站 → SSL → Let's Encrypt 申请的(免费、90 天有效期)。
- 推荐使用 DNS 验证方式(支持泛域名、成功率更高,不受 80/443 端口限制)。
- 宝塔面板版本 ≥ 7.7(内置 acme_v2.py 续签脚本)。
三、核心方案:宝塔内置自动续签脚本
3.1 续签命令
一行命令搞定续签、覆盖旧证书、重载 Nginx:
/www/server/panel/pyenv/bin/python3 -u /www/server/panel/class/acme_v2.py --renew=1 2>&1 | tee -a /www/wwwlogs/ssl_renew.log参数说明:
--renew=1:仅在证书剩余有效期 ≤ 20 天时才触发续签,避免频繁请求 Let's Encrypt 服务器。- 续签成功后会自动覆盖旧证书文件并自动重载 Nginx,无需手动 reload。
- 日志输出到
/www/wwwlogs/ssl_renew.log,方便后续排查问题。
3.2 在宝塔添加计划任务
通过宝塔 Web 界面添加定时任务,步骤如下:
- 登录宝塔面板 → 左侧菜单点击【计划任务】→ 点击【添加定时任务】。
- 按以下配置填写:
- 任务类型:Shell 脚本
- 任务名称:SSL证书自动续签
- 执行周期:每天 03:01(凌晨低峰时段,不影响白天访问)
- 执行用户:root(必须 root,否则权限不足无法写入证书文件)
- 脚本内容:粘贴上面的续签命令
- 保存后,点击【执行一次】测试,查看日志是否出现
renew success字样。
四、证书路径与 Nginx 配置确认
宝塔 Nginx 的证书默认存放路径如下(在站点配置文件中可以查到):
ssl_certificate /www/server/panel/vhost/cert/你的域名/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/你的域名/privkey.pem;续签脚本会自动覆盖这两个文件并重载 Nginx,所以你不需要修改任何 Nginx 配置。
五、替代方案:直接写 crontab
如果你不想通过宝塔的计划任务界面,也可以直接编辑系统 crontab:
# 编辑定时任务
crontab -e
# 添加以下一行(每天凌晨 3:01 执行)
1 3 * * * /www/server/panel/pyenv/bin/python3 -u /www/server/panel/class/acme_v2.py --renew=1 2>&1 | tee -a /www/wwwlogs/ssl_renew.log效果和宝塔计划任务完全一样,只是配置方式不同。
六、常见问题与排查
6.1 执行成功但证书没更新
- 检查执行用户是否为 root,非 root 用户可能无法写入证书目录。
- 查看日志:
tail -f /www/wwwlogs/ssl_renew.log,关注错误信息。 - 确认域名解析正常,DNS API 配置正确(使用 DNS 验证时)。
6.2 HTTP 验证失败
国内服务器经常遇到 HTTP 验证失败的问题(80 端口被拦截、CDN 冲突等)。解决方案:
- 切换为 DNS 验证(推荐),在宝塔 SSL 页面配置对应域名商的 DNS API(支持阿里云、腾讯云、Cloudflare 等)。
- DNS 验证不依赖 80/443 端口,成功率远高于 HTTP 验证。
6.3 想强制立即续签
直接在终端执行续签命令即可,或者在宝塔计划任务中点击【执行一次】。注意:如果证书剩余有效期超过 20 天,--renew=1 会跳过续签。如需强制续签,去掉 --renew=1 参数。
七、进阶方案:使用 acme.sh
如果你不使用宝塔面板,或者需要更灵活的证书管理,可以使用 acme.sh 这个第三方工具。
7.1 安装 acme.sh
curl https://get.acme.sh | sh -s email=your@email.com7.2 申请/续签并部署到 Nginx
/root/.acme.sh/acme.sh --install-cert -d yourdomain.com \
--key-file "/www/server/panel/vhost/cert/yourdomain.com/privkey.pem" \
--fullchain-file "/www/server/panel/vhost/cert/yourdomain.com/fullchain.pem" \
--reloadcmd "service nginx force-reload"acme.sh 安装时会自动添加 crontab 定时任务,默认每天检查一次证书有效期并自动续签。
7.3 手动添加 crontab
0 3 * * * /root/.acme.sh/acme.sh --cron >> /www/wwwlogs/acme_renew.log八、总结
首选方案:宝塔内置脚本 + 计划任务,一行命令搞定续签、覆盖、重载,稳定且由宝塔官方维护。对于大多数使用宝塔面板的用户来说,这是最省心的选择。
如果你没有使用宝塔面板,或者需要更多自定义选项,acme.sh 是成熟的替代方案,社区活跃、文档完善。
无论选择哪种方案,自动化续签都是必须的——别让一张过期的证书毁了你网站的信任度。
评论区