宝塔面板不支持原生多站点统一ssl管理,需通过脚本+api绕过界面限制,所有站点须共用同一组域名并使用pem格式证书,统一配置ssl_certificate路径,手动重载nginx及执行bt 17同步状态。

宝塔面板不支持原生多站点统一SSL管理,必须通过脚本+API绕过界面限制
宝塔面板的SSL功能本质是单站点绑定,ssl.sh 脚本和 Web UI 都没提供「一个证书批量部署到 N 个站点」的入口。想集中管理,就得跳过面板 UI,直接操作底层 Nginx 配置 + 证书文件,并用脚本控制分发逻辑。
关键前提是:所有目标站点必须共用同一组域名(如 site1.example.com、site2.example.com),否则无法用一张通配符或 SAN 证书覆盖——这点常被忽略,导致自动部署后部分站点仍显示证书不匹配。
- 证书必须是 PEM 格式(
fullchain.pem+privkey.pem),不能是 PFX 或带密码的密钥 - 所有站点的 Nginx 配置中
ssl_certificate和ssl_certificate_key指向同一物理路径,不能各自拷贝一份 - 宝塔会定期扫描
/www/server/panel/vhost/cert/下的证书目录,但不会自动同步配置,必须手动 reload 或触发bt 17
对接第三方 SSL API(如 ZeroSSL、Sectigo)需自行封装签发+轮换逻辑
宝塔内置的 Let’s Encrypt 插件只支持单站申请,且不开放 API 调用入口。要对接外部 API,得用 Python 或 Shell 写独立签发脚本,再把生成的证书推送到指定位置。
以 ZeroSSL 的 ACME v2 API 为例,核心动作不是「调接口」,而是「保活 ACME 账户 + 维护订单状态 + 正确响应 HTTP-01 挑战」——宝塔默认不开放站点根目录的 .well-known/acme-challenge 写入权限,容易卡在验证环节。
- 必须确保每个待部署站点的 Nginx 配置中包含 challenge location 块:
location ^~ /.well-known/acme-challenge/ { root /www/wwwroot/common-acme; } - 所有站点共享同一个 ACME 账户密钥(
account.key),避免被限频;建议用acme.sh --register-account提前生成 - 签发成功后,不要直接覆盖旧证书,先校验
openssl x509 -in fullchain.pem -text -noout | grep "DNS:"确认 SAN 包含全部域名 - 宝塔的证书列表缓存有时效,更新文件后需执行
bt 17强制重载 SSL 配置,否则 Web UI 里仍显示「未启用」
自动分发证书到多个站点的本质是批量修改 Nginx 配置文件
宝塔把每个站点的 Nginx 配置存在 /www/server/panel/vhost/nginx/ 下,文件名即域名。所谓「自动分发」,就是用脚本遍历目标站点配置文件,替换其中两行:
ssl_certificate /www/server/panel/vhost/cert/shared/fullchain.pem; ssl_certificate_key /www/server/panel/vhost/cert/shared/privkey.pem;
不能用软链接替代,因为宝塔的「SSL 设置」页面会读取配置中的硬编码路径,若指向软链接,UI 可能误判为「无证书」。
- 务必备份原配置:
cp site1.example.com.conf site1.example.com.conf.bak - 用
sed -i替换时注意转义斜杠,推荐用sed -i 's|ssl_certificate.*|ssl_certificate /www/.../fullchain.pem;|' - 替换完成后执行
nginx -t && systemctl reload nginx,再补一句bt 17同步面板状态 - 如果某站点启用了「强制 HTTPS」,但证书路径还没生效,会导致 502 或无限重定向,建议先关闭该选项再批量操作
最易被忽略的坑:证书续期后 Nginx worker 进程未加载新证书
即使脚本成功替换了证书文件、重载了 Nginx 配置,老的 worker 进程仍可能持有旧证书的内存副本,直到连接超时或主动 kill。用户访问时会看到「证书已过期」提示,但 curl -I https://site1.example.com 却返回 200——这是典型的新旧证书混用现象。
解决方法不是重启 Nginx 全局服务(会中断所有请求),而是用平滑重载 + 强制 worker 退出:
- 执行
kill -USR2 $(cat /www/server/nginx/logs/nginx.pid)启动新 worker - 再执行
kill -WINCH $(cat /www/server/nginx/logs/nginx.pid.oldbin)优雅关闭旧 worker - 检查
ps aux | grep nginx确认只有新 pid 存在 - 最后用
openssl s_client -connect site1.example.com:443 -servername site1.example.com 2>/dev/null | openssl x509 -noout -dates验证生效时间
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











