宝塔定时任务实现SSL证书自动续期稳定HTTPS
宝塔定时任务实现SSL证书自动续期,稳定保住HTTPS
很多站长遇到网站HTTPS打不开,往往不是服务器故障,而是SSL证书过了有效期。
宝塔面板虽然自带Let's Encrypt申请和续期功能,但有时因为服务器重启、脚本中断或DNS校验失败,到期后并没有自动续上。
本文用宝塔定时任务接管证书续期,让你不用每次手动处理,彻底解决SSL证书到期忘续的麻烦。
续期前需要准备什么
开始操作前,确认以下条件已经满足:
- 已安装宝塔面板,并且能正常登录后台。
- 域名已解析到当前服务器,且网站已能通过HTTP访问。
- 服务器80端口和443端口已放行,尤其是80端口,用于验证域名归属。
- 建议先给服务器做一次快照,防止配置失误导致网站短暂不可用。
准备好这些,下面操作大概十分钟完成。
让定时任务接管证书续期
推荐用acme.sh配合宝塔的“计划任务”模块,因为acme.sh稳定度高,支持自动续期和多种校验方式。
1. 安装acme.sh
SSH登录服务器,执行:
curl https://get.acme.sh | sh -s email=你的邮箱@example.com
source ~/.bashrc
安装完成后,acme.sh会自动创建定时任务检查证书是否快到期,但为了更稳妥,我们还是在宝塔里再建一个任务双保险。
2. 申请证书并指定部署目录
如果你的网站根目录是/www/wwwroot/example.com,申请证书并安装到该目录:
~/.acme.sh/acme.sh --issue -d example.com -d www.example.com --webroot /www/wwwroot/example.com
~/.acme.sh/acme.sh --install-cert -d example.com -d www.example.com \
--key-file /www/server/panel/vhost/cert/example.com/privkey.pem \
--fullchain-file /www/server/panel/vhost/cert/example.com/fullchain.pem \
--reloadcmd "nginx -s reload"
上面命令会把证书写到宝塔站点对应的证书目录,并在续期后自动重载Nginx。example.com换成你自己的域名,目录提前用mkdir -p创建好。
3. 配置宝塔计划任务
进入宝塔后台的“计划任务”,添加任务:
- 任务类型:Shell脚本
- 任务名称:ssl-renew
- 执行周期:每天 04:30(选择每天即可)
- 脚本内容:
~/.acme.sh/acme.sh --cron --home ~/.acme.sh >/dev/null 2>&1
保存后建议先“执行一次”,看是否正常完成。
这样即使服务器重启导致原定时任务丢失,宝塔里的任务也会在每天凌晨自动检查并续期。
常见坑和排查技巧
证书续期后网站还是提示不安全
多半是证书路径填错或Nginx没有重载。
先检查/www/server/panel/vhost/cert/你的域名/下是否生成了新证书,再手动执行nginx -s reload。
宝塔后台如果开了SSL缓存,可以重启Nginx或清一下浏览器缓存。
acme.sh命令报错acme.sh: command not found
没有加载环境变量。
执行:
alias acme.sh=~/.acme.sh/acme.sh
然后在计划任务里写完整路径~/.acme.sh/acme.sh。
校验失败:HTTP_01或DNS问题
确认域名解析生效,80端口能访问,且网站根目录下能临时写入文件。
部分CDN会拦截验证请求,建议先关掉CDN再申请。
如何确认续期真的生效
配置完成后,直接在宝塔计划任务里点“执行一次”,然后看执行日志。
如果日志最后显示Reloading nginx且没有任何错误,基本就成功了。
更严谨的验证方式是在浏览器打开:
https://你的域名
点击地址栏小锁图标,查看证书有效期是否已经更新。
也可以运行下面的命令查看证书到期时间:
echo | openssl s_client -servername 你的域名 -connect 你的域名:443 2>/dev/null | openssl x509 -noout -dates
如果显示的是当前日期一年左右后到期,说明自动续期链路已经打通。
按上面的方式配置后,只要服务器时间准确、域名解析稳定,证书续期就不再需要人工盯着。
后续遇到宝塔升级或迁移服务器,记得检查计划任务里的脚本是否还存在,以及证书路径是否仍然有效,HTTPS就能一直稳定运行下去。