多站点统一批量申请SSL证书宝塔脚本
如果你的宝塔面板上挂了十几个甚至更多网站,每三个月手动申请一次 Let‘s Encrypt 证书,重复劳动不说,还容易漏掉某个站点。
这时候,一套“多站点统一批量申请SSL证书宝塔脚本”就能帮你一次搞定所有站点。
本文按照零基础可操作的方式,从准备条件、脚本执行到排错验证,一步一步讲清楚。
适用场景与准备条件
这个方案适用于所有站点都在同一台服务器、宝塔面板已安装并正常运行的环境。
在动手之前,确认以下几点:
- 宝塔面板已登录,并且所有网站已经添加成功、域名已解析到服务器 IP。
- 服务器能够正常访问外网(申请证书需要验证域名)。
- 你有一个能执行 Shell 命令的 SSH 工具(如 Xshell、Putty 或宝塔的终端功能)。
- 了解自己的宝塔面板版本(本文基于 7.x 版本,向下兼容)。
编写批量申请脚本
宝塔面板自身提供了 Let‘s Encrypt 免费证书的单个申请功能,但要想批量执行,就需要借助 acme.sh 脚本 或宝塔官方的 API 接口。
这里推荐 acme.sh,因为它稳定且支持通配符证书,关键是能写循环自动处理多个域名。
第一步:安装 acme.sh
在 SSH 中执行:
curl https://get.acme.sh | sh -s email=你的邮箱@example.com
安装完成后重新加载 Shell 环境:
source ~/.bashrc
第二步:申请 API 密钥(如果你使用 DNSPod、阿里云等 DNS 验证)
为了批量且静默地验证域名,建议使用 DNS API 模式。以腾讯云 DNSPod 为例,去控制台获取 DP_Id 和 DP_Key,然后 export 环境变量。
第三步:编写批量脚本
创建一个文件 batch_ssl.sh,内容如下:
#!/bin/bash
# 要申请的域名列表,一行一个
domains=(“example1.com” “example2.com” “example3.net”)
# 证书输出目录(可选)
output_dir=“/etc/nginx/ssl”
mkdir -p “$output_dir”
for domain in “${domains[@]}”; do
echo “正在为 $domain 申请证书...”
acme.sh --issue --dns dns_dp -d “$domain” --keylength ec-256
# 安装证书到宝塔默认路径(根据实际修改)
acme.sh --install-cert -d “$domain” \
--cert-file “$output_dir/$domain.crt” \
--key-file “$output_dir/$domain.key” \
--fullchain-file “$output_dir/$domain.fullchain.crt”
echo “$domain 完成。”
done
注意:dns_dp 代表 DNSPod,
如果域名在其他服务商,
请修改 --dns 参数(如 dns_cf 对应 Cloudflare)。keylength ec-256 表示 ECC 证书,
兼容性好。
第四步:执行脚本
给予执行权限并运行:
chmod +x batch_ssl.sh
./batch_ssl.sh
等待所有域名验证完成,通常每个域名 10-30 秒。
第五步:在宝塔面板中关联证书
生成证书文件后,需要去宝塔后台 网站 → 对应站点 → SSL → 其他证书,手动上传 .key 和 .fullchain.crt 文件并保存。这一步需要逐个操作,但证书已提前申请好,只需上传,比逐个从零申请快很多。
高频问题与避坑指南
Q:申请过程中提示“无权限”或“连接超时”怎么办?
A:检查服务器是否可正常访问 api.acme.sh 和 Let‘s Encrypt 的验证服务器。防火墙开启 80 和 443 端口;DNS API 密钥是否写对。
Q:批量申请会不会被 Let’s Encrypt 限制频率?
A:Let‘s Encrypt 对每个域名的申请频率为 50 次/周。你平时手动操作也没问题,但脚本执行时如果域名数量很多(超过 200),建议分批执行,每次间隔几分钟。
Q:证书申请成功后,宝塔面板不识别?
A:宝塔默认的 SSL 存储路径不同,你的脚本输出目录需要与宝塔一致。最简单的方法:先在宝塔上手动为某个站点申请一次证书,然后记录证书实际存储路径(一般是 /www/server/panel/vhost/cert/站点目录/),修改脚本中的输出目录即可。
避坑重点:
- 不要在凌晨执行大量申请,容易触发 Let’s Encrypt 的限制规则。
- 定期检查证书有效期,建议设置 crontab 每月 1 号执行一次脚本,同时更新宝塔的证书文件。
- 如果站点使用了反向代理或 CDN,需要确保验证时源站可正常返回 80/443 响应,否则验证失败。
效果验证
执行完成后,随便访问几个站点,查看浏览器地址栏的锁标志是否正常。
在宝塔后台的 网站 → SSL 页面,也可以看到证书状态和到期时间。
你也可以用命令验证:
curl -I https://example1.com 2>/dev/null | grep “SSL”
如果输出包含证书信息,说明批量申请成功。
至此,你已经掌握了在宝塔面板中通过脚本批量申请 SSL 证书的方法。
以后站点数量增加时,只需修改脚本中的域名列表,再执行一遍就行。
如果你想了解更多宝塔自动续期的配置,可以继续阅读本站相关教程。