用户登录
个人主页 用户中心 我的订单 添加授权 管理授权
退出登录
用户登录 用户注册
欢迎来到 UC建站系统

30个站点,手动一个一个点SSL申请、等验证、部署,搞完抬头一看天都黑了。关键三个月后证书过期,又得来一遍。这事不能靠人工扛,得让它自动跑。

三种方案,对应三种站点规模。10个以内用面板自带的一键批量就够了;50个以内上Shell脚本配计划任务;100个以上用GitHub开源工具调API。每种方案的操作步骤、脚本代码、容易踩的坑,逐个说清楚。

一、先搞清楚:你要的是"批量申请"还是"批量续签"

这两个场景不一样,方案也不同:
场景什么时候碰到推荐方案
批量首次申请新服务器迁移、批量建站、全面上HTTPS面板自带批量(10个内)→ Shell脚本调acme.sh(50个内)→ baota_BT_SSL工具(100+)
批量自动续签证书快到期、怕忘记续导致网站挂掉面板计划任务(基础)→ Shell脚本+crontab(可靠)→ Certd开源工具(跨服务器)
泛域名/通配符一个证书覆盖所有子域名(*.example.com)必须用DNS API验证,HTTP文件验证不支持泛域名

二、方案一:面板自带批量申请(10个站点以内)

这是最简单的方法,不需要任何代码,纯鼠标操作。

2.1 操作步骤

进入宝塔面板 → 网站列表页
勾选左侧复选框,选中所有需要部署SSL的站点
顶部操作栏点击 SSL → Let's Encrypt
验证方式选"自动验证"(默认),点击申请
面板自动逐个验证域名、签发证书、部署到站点

全程大约1-2分钟,面板会逐个处理,完成后每个站点自动启用HTTPS。

2.2 前提条件(三个都要满足,缺一个就失败)

  • 所有域名已正确解析到当前服务器IP(ping 域名 看返回的IP对不对)
  • 80端口已放行(宝塔面板 → 安全 → 放行80端口;云服务器安全组也要放行)
  • 站点根目录存在且有写入权限(Let's Encrypt需要在 .well-known/acme-challenge/ 目录下写验证文件)

2.3 批量操作避坑

问题原因解决
提示"验证超时"域名没解析到本机 / 80端口被防火墙挡了检查DNS解析+放行80端口
添加站点后立即验证HTTPS失败DNS解析还没完全生效等5-10分钟再试
站点超过20个一次性批量太多,面板可能超时分批次操作,每次10个
某个站点一直失败该站点的nginx配置可能有301重定向,拦截了验证路径见下文"续签失败排查"中的Nginx配置修正

三、方案二:Shell脚本批量(50个站点以内)

超过10个站点,面板批量可能超时。用Shell脚本调acme.sh逐个申请和部署,然后配计划任务自动续签。

3.1 安装acme.sh

curl https://get.acme.sh | sh -s email=your@email.com

安装完成后acme.sh在 `~/.acme.sh/` 目录下,自动添加了crontab别名。

3.2 创建域名列表文件

# 创建 /root/domains.txt,每行一个域名

cat > /root/domains.txt << EOF

example1.com

example2.com

www.example3.com

shop.example4.com

EOF

1 - 30个站点,手动一个一个点SSL申请、等验证、部署,搞完抬头一看天都黑了。关键三个月后证书过期,又得来一遍。这事不能靠人工扛,得让它自动跑。 - UC建站系统

3.3 批量申请+部署脚本

创建 `/root/batch_ssl.sh`:

#!/bin/bash

# 域名列表文件

DOMAIN_FILE="/root/domains.txt"

# 日志文件

LOG_FILE="/var/log/batch_ssl.log"

# 记录开始时间

echo "========== $(date) 开始批量处理 ==========" >> $LOG_FILE

while IFS= read -r domain; do

if [ -z "$domain" ]; then

continue

fi

echo "[$(date '+%H:%M:%S')] 处理: $domain" | tee -a $LOG_FILE

# 用acme.sh签发证书(文件验证方式)

~/.acme.sh/acme.sh --issue -d "$domain" \

-w "/www/wwwroot/$domain" --force 2>&1 | tee -a $LOG_FILE

if [ ${PIPESTATUS[0]} -eq 0 ]; then

echo " ✓ 签发成功: $domain" | tee -a $LOG_FILE

# 部署到宝塔证书目录

CERT_DIR="/www/server/panel/vhost/cert/$domain"

mkdir -p "$CERT_DIR"

~/.acme.sh/acme.sh --install-cert -d "$domain" \

--key-file "$CERT_DIR/privkey.pem" \

--fullchain-file "$CERT_DIR/fullchain.pem" 2>&1 | tee -a $LOG_FILE

echo " ✓ 证书已部署到 $CERT_DIR" | tee -a $LOG_FILE

else

echo " ✗ 签发失败: $domain" | tee -a $LOG_FILE

fi

done < "$DOMAIN_FILE"

2 - 30个站点,手动一个一个点SSL申请、等验证、部署,搞完抬头一看天都黑了。关键三个月后证书过期,又得来一遍。这事不能靠人工扛,得让它自动跑。 - UC建站系统

# 重载Web服务

/etc/init.d/nginx reload

echo "========== $(date) 全部完成 ==========" >> $LOG_FILE

注意:如果你的站点目录名跟域名不一致,把 /www/wwwroot/$domain 改成实际路径。Apache用户把最后一行改成 /etc/init.d/httpd reload

3.4 配计划任务自动续签

宝塔面板 → 计划任务 → 添加任务:
配置项填写内容
任务类型Shell脚本
任务名称批量续签SSL证书
执行周期每月1号 凌晨3:00(Let's Encrypt有效期90天,每月跑一次绰绰有余)
脚本内容/root/batch_ssl.sh
另外,宝塔面板本身也有一个内置的续签任务。在计划任务中找一下有没有"续签Let's Encrypt证书"这个任务,确认状态是"启用"。脚本内容是:

/www/server/panel/pyenv/bin/python3 -u /www/server/panel/class/acme_v2.py --renew_v2=1

两个任务都开着,双保险。

四、方案三:开源工具批量(100个站点以上)

站点数量破百,Shell脚本逐个串行处理太慢了。两个开源工具推荐:

4.1 baota_BT_SSL:宝塔API图形化工具

这是一个Windows桌面程序,通过宝塔API接口直接操作面板,不需要登录面板网页。

功能覆盖:

  • 批量建站(导入域名列表,自动创建站点)
  • 批量申请SSL证书(一次性处理数百个域名)
  • 一键部署HTTPS强制跳转
  • 批量续签证书
  • 文件批处理(批量解压、复制、移动)
使用步骤:

宝塔面板 → 面板设置 → API接口 → 开启API → 获取App Key
把运行工具电脑的公网IP加到白名单
打开BaoTaApi.exe,填入面板地址+App Key → 连接
导入域名列表 → 选择批量申请SSL → 勾选"强制HTTPS" → 执行

GitHub仓库:github.com/xiaocaiji61/baota_BT_SSL,免安装,下载exe直接运行。适合代理商、站群运营、批量运维场景。

4.2 Certd:跨服务器的证书管理平台

如果你的证书分布在多台服务器上,baota_BT_SSL一次只能连一台面板。Certd是一个独立的证书管理平台,通过Docker部署,统一管理所有服务器和所有域名的证书。

核心能力:

  • 全自动申请证书(支持阿里云、腾讯云、华为云域名)
  • 全自动部署证书到多台服务器(宝塔面板、Nginx、CDN等)
  • 支持通配符/泛域名证书
  • 证书到期前自动续签+自动部署,无需人工干预
  • 可视化流水线,拖拽式配置
Docker一键部署:

docker run -d \

--name certd \

-p 7001:7001 \

-v /opt/certd/data:/app/data \

registry.cn-beijing.aliyuncs.com/certd/certd:latest

部署后访问 `http://服务器IP:7001` 进入管理界面。GitHub: github.com/certd/certd。

五、泛域名证书:一个证书覆盖所有子域名

如果你一个主域名下面有大量子域名(www、shop、m、api、admin……),逐个申请太累。一张泛域名证书(*.example.com)可以覆盖所有一级子域名。

5.1 关键认知:泛域名只能用DNS验证

HTTP文件验证对泛域名无效。Let's Encrypt的ACME协议强制要求:通配符域名只能走DNS-01挑战(即添加TXT记录验证),不能走HTTP-01。很多人卡在这一步,就是因为没切换验证模式。

5.2 操作步骤

第一步:获取DNS API密钥去你的域名DNS服务商获取API密钥。以最常用的阿里云和腾讯云为例:
DNS服务商获取位置所需权限
阿里云RAM访问控制 → 创建子用户 → 获取AccessKeyAliDNS:DescribeDomainRecords + AliDNS:AddDomainRecord
腾讯云DNSPodDNSPod控制台 → API密钥 → 获取SecretId/SecretKeyQcloudDNSPodFullAccess(或最小权限:CreateRecord + DeleteRecord)
第二步:在宝塔面板申请泛域名证书

网站 → 对应域名 → 设置 → SSL → Let's Encrypt
点击右上角"设置",勾选"使用DNS API验证"(这一步最容易漏!
选择你的DNS服务商,填入API密钥
域名框填写:*.example.com,example.com(英文逗号分隔,无空格)
点击申请

5.3 泛域名格式的三个坑

✓ 正确写法

*.example.com,example.com

必须同时包含泛域名和根域名,因为 *.example.com 不覆盖 example.com 本身

✗ 常见错误

· 只写 *.example.com → 根域名没覆盖
· 写 **.example.com → 不支持多级通配
· 写 *.sub.example.com → 只能单级通配
· 有空格 → *.example.com, example.com

5.4 泛域名证书的续签

DNS模式申请的泛域名证书,自动续签不会默认开启。申请成功后要手动检查:· 计划任务中是否有"续签Let's Encrypt证书"任务,执行周期为每天/每月· 如果没有,手动添加Shell脚本任务:`/www/server/panel/pyenv/bin/python /www/server/panel/class/acme_v2.py --renew`· DNS API密钥一旦变更(如重置了AccessKey),所有已部署的泛域名证书续签会静默失败——面板不报警,证书过期了才知道建议申请完后立刻点一次"续签"按钮,测试整个链路是否通畅。

六、自动续签失败的五个排查方向

证书到期前没续上,网站挂了才发现,这种事故太常见了。五个原因逐个排查:
#排查项检查方法解决方法
180端口不通netstat -tlnp | grep :80
看Nginx是否在监听
宝塔安全页面放行80端口 + 云服务器安全组放行80端口
2301重定向拦截验证路径Nginx配置中80端口是否全站301到了HTTPS,导致 .well-known/acme-challenge/ 路径也被重定向在80端口的server块中加例外规则(见下方代码)
3计划任务被禁用/删除宝塔计划任务页面,确认"续签Let's Encrypt证书"任务状态为"启用"重新启用或手动创建
4面板版本过旧老版本(如9.0.0)有已知bug,证书内容比对不匹配更新宝塔面板到最新版
5DNS API密钥变更如果用了DNS验证+泛域名证书,密钥轮换后不会自动同步更新面板中的API密钥后,手动触发一次续签验证

修正Nginx配置:80端口验证路径例外

如果你的站点做了全站HTTPS强制跳转,80端口的server块大概率长这样:

server {

listen 80;

server_name example.com www.example.com;

# ⚠️ 这一段必须有!

location /.well-known/acme-challenge/ {

root /www/wwwroot/你的站点根目录;

try_files $uri =404;

}

# 其他请求跳转HTTPS

location / {

return 301 https://$host$request_uri;

}

}

关键是 `.well-known/acme-challenge/` 这个路径不能跳转HTTPS,否则Let's Encrypt的验证请求会被301重定向,永远验证不通过。

七、宝塔9.4.0+的官方自动部署方案

宝塔9.4.0版本开始内置了一个"证书自动部署"功能,适合多台服务器统一管理证书:

主服务器:SSL → 证书管理 → 上传云端
宝塔官网后台:SSL管理 → 创建同步任务 → 生成同步密钥
目标服务器:SSL → 自动部署 → 创建 → 填入密钥 → 选择站点
官网后台:确认接入 → 证书自动同步到所有目标服务器

适用场景:一台主服务器签发证书,多台服务器自动同步。证书到期前自动拉取新证书并部署。免费版可用,不需要额外付费。

八、三种方案怎么选

方案适合站点数上手难度自动化程度一句话总结
面板自带批量≤10个★☆☆ 零门槛首次批量手动
续签靠计划任务
站点少的直接勾选一键搞定
Shell脚本+计划任务10-50个★★☆ 懂基础Linux首次批量+每月自动续签复制脚本改路径就能跑
baota_BT_SSL50-200个★★☆ 会开API就行批量建站+SSL+HTTPS一条龙代理商、站群运营首选
Certd100+跨服务器★★★ 需要Docker全自动申请+部署+续签多台服务器统一管理,一次配置长期免维护
宝塔9.4.0+自动部署多服务器同步★☆☆ 纯面板操作证书云端托管+自动同步官方方案,免费且稳定

SSL证书这件事,核心问题不是"怎么申请",而是"怎么不忘记续"。Let's Encrypt证书90天有效期,一年要续4次,靠人脑记住是不可能的。不管你站点多少,配好计划任务或自动部署之后,去UptimeRobot之类的免费监控工具加一个SSL到期提醒——到期前30天发邮件,这是最后一道防线。

10个站点以内:面板自带批量+计划任务就够了。10-50个:把上面Shell脚本复制下来,改一下域名列表和站点路径,配好计划任务。50个以上:baota_BT_SSL或Certd二选一,前者适合单台服务器批量操作,后者适合多台服务器统一管理。搞完之后把证书到期监控也配上,以后就不用再操心这件事了。

相关推荐
在线客服
👇找客服拿折扣
QQ咨询&售后
在线时间
11:00 ~ 5:30
QQ:3155555535
👇联系QQ
👇联系WX
首页 程序 帮助 登录