宝塔定时脚本实现SSL证书自动续期
宝塔定时脚本实现SSL证书自动续期,零基础也能搞定
核心答案
使用宝塔面板部署的网站,SSL证书(如Let's Encrypt)有效期通常为90天,到期后需要手动续期。
通过编写一条定时脚本,配合宝塔计划任务,你可以让服务器在证书到期前自动完成续期,整个过程无需人工干预。
本文面向零基础用户,提供一套可直接运行的脚本和配置步骤,确保SSL证书始终有效,避免因证书过期导致网站无法访问。
为什么需要自动续期?
大部分免费的SSL证书(包括Let's Encrypt、ZeroSSL等)有效期只有90天。
虽然宝塔面板内置了收费版专业SSL或手动续期功能,但对于免费证书,宝塔默认不会自动续期。
如果忘记手动更新,证书过期后浏览器会显示“不安全”警告,严重影响用户体验和SEO排名。
使用定时脚本,每月或每两个月自动执行一次续期,彻底解放双手。
准备阶段:环境检查与权限
在开始之前,请确保你的服务器满足以下条件:
- 宝塔面板已安装并正常运行(推荐使用最新稳定版)。
- 网站已配置了SSL证书(手动申请或通过宝塔免费证书插件)。
- 服务器可以正常出站访问 Let's Encrypt 的验证服务器(80端口和443端口通常需要开放)。
- 命令行:你需要通过SSH登录服务器,或者使用宝塔面板的终端功能(面板左侧 → 终端)。
- acme.sh:建议提前安装acme.sh(一个强大的ACME协议客户端),它比宝塔自带的证书管理更灵活,支持多种DNS API。
如果你是云服务器用户,比如使用泽御云的云服务器,确认安全组已放行80和443端口即可。
操作步骤:编写自动续期脚本并配置计划任务
第一步:安装acme.sh(如果尚未安装)
通过SSH登录服务器,执行以下命令安装acme.sh:
curl https://get.acme.sh | sh -s email=你的邮箱@example.com
安装完成后,会提示将acme.sh加入环境变量。
通常重启终端或执行 source ~/.bashrc 即可。
验证安装:
acme.sh --version
第二步:获取已有证书的详细信息
如果之前通过宝塔面板申请的Let's Encrypt证书,我们需要知道证书的域名和对应的存放路径。
可以通过宝塔面板的“网站” → 对应网站 → “SSL”看到证书域名。
记录下域名,例如 example.com。
第三步:编写续期脚本
创建一个Shell脚本文件,比如 /root/renew_ssl.sh,内容如下(请根据你的域名和路径修改):
#!/bin/bash
# 设置acme.sh环境变量
export PATH="/root/.acme.sh:${PATH}"
# 需要续期的域名(多个域名用空格隔开)
DOMAINS="example.com www.example.com"
for domain in $DOMAINS; do
acme.sh --renew -d "$domain" --force
if [ $? -eq 0 ]; then
# 续期成功后,重新部署到宝塔面板(假设网站目录为 /www/wwwroot/example.com)
# 注意:宝塔面板的证书路径通常是 /www/server/panel/vhost/cert/
# 这里我们直接复制证书到对应网站目录(视具体配置,推荐使用宝塔的API或直接覆盖)
mkdir -p /www/server/panel/vhost/cert/"$domain"
acme.sh --install-cert -d "$domain" \
--cert-file /www/server/panel/vhost/cert/"$domain"/fullchain.pem \
--key-file /www/server/panel/vhost/cert/"$domain"/privkey.pem \
--reloadcmd "nginx -s reload"
echo "证书续期成功:$domain"
else
echo "证书续期失败:$domain" >> /root/cert_renew_error.log
fi
done
注意:如果你的网站使用Nginx,--reloadcmd可以设置为systemctl reload nginx或nginx -s reload。宝塔面板通常使用Nginx。
赋予脚本执行权限:
chmod +x /root/renew_ssl.sh
第四步:通过宝塔计划任务设置定时运行
- 登录宝塔面板,点击左侧菜单“计划任务”。
- 点击“添加任务”。
- 任务类型选择“Shell脚本”。
- 任务名称填写“SSL证书自动续期”。
- 执行周期选择“每月”,并设置具体日期,比如“1号”或“15号”,避免与证书到期日冲突。也可以选择“每两个月”一次。
- 脚本内容填写:
bash /root/renew_ssl.sh(或者直接粘贴上面的脚本内容)。 - 点击“添加”保存。
另一种方式:如果你习惯使用Linux cron,也可以直接在SSH中执行crontab -e添加一行:
0 0 1 */2 * bash /root/renew_ssl.sh(每两个月第一天凌晨执行)
避坑指南与常见问题
- 脚本执行失败:检查acme.sh是否已经完成初始化,并且邮箱正确。可以手动运行一次脚本看输出日志。
- 证书路径错误:宝塔面板的证书目录可能因版本不同而变化,建议先在宝塔面板的“SSL”设置中复制证书路径对比。
- 计划任务未生效:检查宝塔面板的计划任务日志(在计划任务列表右侧的“日志”按钮),确认是否有执行记录。
- 域名验证失败:Let's Encrypt 续期需要验证域名所有权,默认使用HTTP-01验证。确保网站目录下的
.well-known/acme-challenge可被外网访问。如果使用了CDN或反向代理,建议暂时关闭。 - acme.sh 版本升级:定期执行
acme.sh --upgrade确保协议兼容性。
效果验证
手动执行一次续期脚本:
bash /root/renew_ssl.sh
观察终端输出,显示“证书续期成功:example.com”表示成功。
然后访问网站,查看SSL证书有效期是否已更新。
你也可以通过宝塔面板 → 网站 → SSL,点击“查看证书”检查到期时间。
如果有报错,查看 /root/cert_renew_error.log 日志文件定位问题。
一切正常后,宝塔计划任务会每月自动执行,无需再手动操作。
FAQ
Q1:使用宝塔内置的证书续期功能不行吗?
宝塔面板的“续期”按钮通常只对收费证书或部分免费证书有效,而且需要手动点击。
定时脚本可以完全自动化,尤其适合多站点或需要长期运维的场景。
Q2:脚本里为什么用 --reloadcmd?
续期后的新证书需要重新加载到Web服务器(Nginx/Apache)才能生效。--reloadcmd 会自动执行重载命令,避免手动重启服务。
Q3:脚本运行提示“No domain found”怎么办?
说明acme.sh没有找到该域名的证书记录。
检查 acme.sh --list 查看已管理的证书列表,确保域名拼写正确,并且证书是通过acme.sh申请的。
如果首次通过宝塔申请的证书,需要先用acme.sh重新导入(通过 acme.sh --issue 重新申请)。
Q4:使用CDN或Cloudflare会影响续期吗?
会影响。
Let's Encrypt的HTTP-01验证需要直接访问源站80端口。
如果使用了CDN,验证请求可能被CDN劫持,建议使用DNS-01验证(acme.sh支持Cloudflare等DNS API),或临时关闭CDN等验证通过后再开启。
如果你正在处理宝塔面板的SSL续期问题,建议先按本文步骤手动跑一次脚本,确认无报错后再开启定时任务。
遇到异常时优先检查日志和证书路径,也可以参考宝塔官方文档或泽御云的技术支持获取帮助。