多站点批量申请免费SSL证书宝塔自动化教程

多站点SSL证书手动申请太麻烦?试试宝塔自动化方案

如果你在宝塔面板上跑了十几个网站,每个站点都要单独点击申请Let's Encrypt证书,不仅费时,还容易漏掉某个域名的续签。
本文介绍一种利用宝塔计划任务配合Shell脚本,一次性批量申请并自动续签免费SSL证书的方法,全程无需手动操作每个站点。

前置准备:确保你的环境满足条件

在开始之前,请确认以下几点:

  • 宝塔面板已安装:建议使用最新稳定版,旧版可能缺少部分命令行工具。
  • 所有站点已添加:在宝塔“网站”列表中能看到每个域名的站点记录,且域名DNS已正确解析到服务器IP。
  • 80和443端口已放行:服务器安全组和宝塔防火墙都要开放这两个端口,否则证书验证会失败。
  • acme.sh 已安装:宝塔面板默认不集成acme.sh,你需要手动安装。打开SSH终端执行:
  curl https://get.acme.sh | sh -s email=your_email@example.com

(把邮箱换成你自己的,用于接收证书到期通知)

核心操作:编写批量申请脚本并配置自动执行

1. 编写Shell脚本自动检测所有站点

登录宝塔面板,从左侧菜单进入“文件”管理,在 /root/ 目录下新建一个文件 batch_ssl.sh,内容如下:

#!/bin/bash
# 批量申请Let's Encrypt证书
# 通过宝塔数据库获取已添加的域名列表

# 设置acme.sh路径
ACME_PATH=~/.acme.sh/acme.sh

# 获取所有站点域名(排除默认站点和系统保留域名)
SITES=$(mysql -uroot -p$(cat /www/server/panel/script/mysql_manage.sh | grep 'root' | head -1 | awk '{print $NF}') -e "SELECT domain FROM bt_sites WHERE domain NOT LIKE '%default%' AND domain NOT LIKE '%phpmyadmin%' AND domain NOT LIKE '%localhost%'" 2>/dev/null | tail -n +2)

for domain in $SITES; do
    echo "处理域名: $domain"
    # 检查是否已有证书
    if [ -d "$HOME/.acme.sh/${domain}_ecc" ] && [ -f "$HOME/.acme.sh/${domain}_ecc/${domain}.cer" ]; then
        echo "  -> 证书已存在,尝试续签"
        $ACME_PATH --renew -d $domain --force --ecc
    else
        echo "  -> 申请新证书"
        # 使用webroot验证,这里需要确保站点根目录存在
        WEBROOT="/www/wwwroot/$domain"
        if [ -d "$WEBROOT" ]; then
            $ACME_PATH --issue -d $domain --webroot $WEBROOT --ecc
        else
            echo "  -> 站点目录不存在,跳过"
        fi
    fi
    # 部署证书到宝塔Nginx(可选自动部署)
    # 这里简化:acme.sh会自动安装证书,但宝塔可能需要手动重载
    # 实际生产中可以调用宝塔API或手动替换文件
done

echo "批量操作完成"

2. 设置脚本执行权限并测试

在SSH终端执行:

chmod +x /root/batch_ssl.sh
bash /root/batch_ssl.sh

观察输出,确认每个域名都被处理。
如果acme.sh提示domain not found,说明脚本中的数据库查询可能不兼容你的宝塔版本。
备选方案是手动将要处理的域名写入一个文本文件,让脚本逐行读取。

3. 添加宝塔计划任务实现自动续签

在宝塔面板左侧菜单点击“计划任务”,添加一个任务:

  • 任务类型:Shell脚本
  • 任务名称:批量SSL续签
  • 执行周期:每月1号凌晨3点(每月一次足以覆盖Let's Encrypt的90天有效期)
  • 脚本内容bash /root/batch_ssl.sh

保存后,任务就会按计划自动运行。
你还可以在通知设置中打开“任务完成提醒”,以便及时获知执行状态。

避坑指南:常见问题与解决办法

  • 数据库连接失败:如果脚本中获取密码部分报错,可以改用固定密码。宝塔默认MySQL密码存储在 /www/server/panel/script/mysql_manage.sh 中,但不同版本路径可能不同。更稳妥的方式:手动在 /root/.my.cnf 中写入MySQL凭据。
  • 域名目录不存在:宝塔创建站点时默认wwwroot下有对应目录,如果使用反向代理或静态站点目录不一致,需手动修改脚本中的WEBROOT变量。
  • 证书部署到Nginx失败:acme.sh安装证书后会自动重载Nginx,但宝塔面板可能由于配置文件路径特殊而失效。解决方案是在脚本最后加上 nginx -s reloadsystemctl reload nginx
  • 同一域名多站点(如带www和不带www):建议在宝塔中只添加一个“主域名”站点,其他域名通过“域名管理”附加,这样证书申请会自动包含所有别名。

效果验证:检查证书是否生效

脚本执行完成后,用浏览器访问任意站点的HTTPS地址,点击地址栏锁图标查看证书信息。
也可以通过在线工具(如SSLShopper)扫描域名,确认证书签发机构和有效期。
如果所有站点都显示绿色安全锁,说明批量自动化配置成功。

总结

通过以上步骤,你就能在宝塔面板下实现多站点免费SSL证书的批量申请和自动续签。
核心是利用acme.sh配合简单Shell脚本,再结合宝塔计划任务驱动。
如果你遇到某个域名反复报错,可以先单独手动申请一次,排查防火墙或DNS解析问题。
这套方案适合站点数量较多的运维场景,能大幅减少证书管理的工作量。

分享到:
上一篇
磁盘空间爆满自动清理无用日志定时任务
下一篇
数据库读写分离部署高并发外贸商城站点
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意