SSL批量部署的本质——不是申请证书,是管理证书的生命周期申请 给N个域名一次性生成证书(手动一个个点要命)部署 把证书装到Nginx/Apache/IIS的对应站点上(路径不能错)续期 90天到期前自动更新,不自动=每三个月手工搞一次监控 证书快过期了要告警,过期了用户看到的就是红色警告页手上有几十个域名的人,最怕的不是申请证书——是三个月后证书过期了忘了续。免费SSL证书(Let's Encrypt / ZeroSSL / Google Trust Services)有效期只有90天,站群规模越大,证书过期的时间点就越分散。今天A站过期、后天B站过期、下周C站过期,一个一个续能把人搞疯。SSL批量部署工具的核心价值不是"一次申请很多证书",而是"一次配置,永久自动续期,过期了有人通知你"。
先算一笔账:站群SSL,不同方案花多少钱
在选工具之前,先搞清楚你的站群规模适合什么类型的证书。证书类型选错了,免费能搞定的事可能花几千块。
| 证书类型 | 覆盖范围 | 免费方案 | 付费价格(年) | 站群场景适用性 |
|---|
| 单域名证书 | 1个域名(如 example.com) | Let's Encrypt 免费 | ¥50-500/个 | 站群不推荐——每个域名单独申请,管理成本随数量线性增长 |
| 通配符证书 | 1个域名的所有子域名(*.example.com) | Let's Encrypt 免费 | ¥500-3000/个 | 一个主域名下有多个子站的场景(如 beijing.example.com, shanghai.example.com) |
| 多域名SAN证书 | 多个不同域名(如 a.com + b.net + c.org) | 无免费方案 | ¥1000-5000/张 | 多个完全不相关的域名,付费才能一张证书覆盖。但站群通常用免费方案逐个申请更划算 |
| 通配符+多域名 | 多个域名的通配符(*.a.com + *.b.net) | 无免费方案 | ¥3000-10000+/张 | 只有大型企业多品牌站群才需要,一般站群用不上 |
站群SSL最省钱的方案(覆盖95%的场景)· 如果所有站点都在同一个主域名下(如 news.example.com、shop.example.com、blog.example.com):申请一张免费通配符证书 *.example.com,一张证书覆盖全部子站。Let's Encrypt / ZeroSSL / Google Trust Services 都免费提供。· 如果是不相关的多个域名(如 aaa.com、bbb.net、ccc.org):用acme.sh或Certd给每个域名单独申请免费证书,自动化管理,边际成本为零。· 只有一种情况值得付费:你需要OV(组织验证)或EV(扩展验证)证书来显示公司名称,或者你的客户要求商用SSL保险。否则免费DV证书在加密强度上和付费DV证书完全一样。
方案一:acme.sh——命令行批量管理,站群老手首选
acme.sh是目前最成熟的免费SSL证书自动化工具,纯Shell脚本,零依赖,支持Let's Encrypt / ZeroSSL / Google Trust Services / Buypass等多个CA。对站群场景来说,它最强的功能是DNS API验证——不需要在服务器上开放80端口,只需要在DNS服务商处配置API密钥,就能批量申请通配符证书。
acme.sh 站群批量部署完整流程# 1. 安装 acme.shcurl https://get.acme.sh | sh# 2. 配置DNS API(以Cloudflare为例,支持60+家DNS服务商)export CF_Token="你的Cloudflare_API_Token"export CF_Account_ID="你的Account_ID"# 3. 批量申请通配符证书——一个命令,一次搞定acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'# 4. 如果有50个不相关的域名,写个shell循环批量申请# 先把域名列表放在 domains.txt 里,一行一个while read domain; doacme.sh --issue --dns dns_cf -d "$domain" -d "*.$domain"acme.sh --install-cert -d "$domain" \--key-file /etc/nginx/ssl/$domain/key.pem \--fullchain-file /etc/nginx/ssl/$domain/fullchain.pem \--reloadcmd "nginx -s reload"done < domains.txt# 5. 查看所有已管理的证书acme.sh --list# 6. 自动续期——安装acme.sh时已自动添加crontab,无需手动配置# 证书到期前60天自动续期,续期后自动执行 --reloadcmd 重载Nginx
acme.sh 的DNS API支持列表(站群常用)Cloudflare:最推荐,API Token权限粒度细,支持全球/区域性API阿里云DNS:Ali_Key + Ali_Secret,国内站群首选DNSPod(腾讯云):DP_Id + DP_Key,国内用户量大GoDaddy / Namecheap / Name.com:海外域名注册商自带DNS华为云 / 百度云 / 京东云:均支持完整列表:acme.sh --dns 可以查看全部60+家支持的DNS服务商。如果你的DNS不在列表里,也可以用DNS alias模式让一个域名通过已支持的DNS服务商验证。
方案二:Certd——Web界面可视化,不想敲命令行的选这个
Certd是2024年崛起的开源SSL证书管理工具,它的核心卖点是把证书管理变成了"流水线"——申请→部署→通知,每一步都是可视化拖拽配置。Docker一键部署,浏览器打开就能用,不需要记命令。
Certd vs acme.sh 选哪个?| 对比维度 | acme.sh | Certd |
| 操作方式 | 命令行Shell脚本 | Web界面可视化 |
| 部署方式 | 一行curl安装 | Docker / 源码部署 |
| 批量管理 | Shell循环+脚本,灵活但需手写 | 界面批量导入域名,流水线模板化 |
| 部署目标 | 本地服务器(Nginx/Apache) | 本地+云平台(阿里云CDN/腾讯云CDN/七牛云/多吉云等) |
| 告警通知 | 需自行配置邮件/Webhook脚本 | 内置邮件/钉钉/企业微信/Webhook通知 |
| 适合人群 | 熟悉命令行的运维/开发者 | 不想敲命令、需要团队协作、证书要部署到CDN的 |
Certd Docker 一键部署# 一行命令启动docker run -d --name certd \-p 7001:7001 \-v /data/certd:/app/data \gregperry/certd:latest# 浏览器打开 http://你的服务器IP:7001# 默认账号: admin 默认密码: admin123(首次登录后改掉)
Certd 对站群场景最实用的功能:部署到CDN如果你的站群接入了阿里云CDN、腾讯云CDN、七牛云等,证书部署不只是服务器上的事——CDN边缘节点也需要同步证书。Certd内置了主流云平台的部署插件,申请完证书后自动推送到CDN,不用手动去云控制台上传。这个功能是acme.sh做不到的(acme.sh主要管理服务器本地证书)。
方案三:宝塔面板——已经在用宝塔的,直接批量勾选
如果你用宝塔面板管理服务器,SSL批量部署就简单了:进"网站"列表→勾选需要部署SSL的站点→点"批量部署SSL"→选Let's Encrypt→确认。宝塔会自动给每个站点申请证书、配置HTTPS、开启强制HTTPS、添加自动续期计划任务。
宝塔批量部署的注意事项:
1. Let's Encrypt有频率限制——同一个域名每周最多申请5次、每小时最多验证5次。如果一次勾选50个站点,宝塔会排队申请,不会全部同时发出,但建议分批次勾选,每次10-15个,避免触发频率限制导致部分站点申请失败。
2. 宝塔的自动续期依赖计划任务(/www/server/panel/class/acme.sh),默认每天凌晨执行。如果计划任务被误删或服务器时间不准,续期会失败。
3. 宝塔的证书管理界面只能看到每个站点的到期时间,没有全局概览。站群超过20个站点后,建议配合外部监控工具做到期告警。
方案四:Certbot——经典方案,适合单服务器多站点
Certbot是Let's Encrypt官方推荐的客户端,如果你的所有站群站点都在同一台服务器上,并且用的是Nginx或Apache,Certbot的自动化程度很高。
Certbot 批量申请(Nginx场景)# 安装Certbot + Nginx插件apt install certbot python3-certbot-nginx# 批量给多个域名申请证书(逗号分隔)certbot --nginx -d example.com -d www.example.com -d shop.example.com# 自动续期——安装时已自动添加systemd timer或crontabcertbot renew --dry-run # 测试续期流程是否正常
Certbot的局限——为什么站群场景不如acme.shCertbot不支持DNS API验证模式(需要用第三方插件),所以申请通配符证书比较麻烦。而且Certbot默认使用HTTP验证(需要每个域名都能通过80端口访问),如果你的站群分布在不同服务器上,或者有些站点还没解析到服务器,Certbot就验证不过。acme.sh的DNS API模式不受这个限制——只要DNS配好了API,域名解析到哪台服务器、甚至还没解析,都能申请证书。
五种工具全景对比
| 工具 | 通配符 | DNS API | CDN部署 | Web界面 | 通知告警 | 批量管理 | 最合适 |
|---|
| acme.sh | ✓ | 60+家 | ✗ | ✗ | 需自配 | Shell脚本循环 | 命令行熟练的站群老手 |
| Certd | ✓ | 主流平台 | ✓ | ✓ | 内置多渠道 | 流水线模板 | 不想敲命令+需要CDN部署 |
| 宝塔面板 | ✓ | 内置 | ✗ | ✓ | 基础 | 勾选批量 | 已用宝塔管理服务器的用户 |
| Certbot | 需插件 | 需插件 | ✗ | ✗ | 需自配 | 一般 | 单台服务器+同域名多子站 |
| 1Panel | ✓ | 内置 | ✗ | ✓ | 基础 | 批量勾选 | 宝塔的替代品,开源Linux面板 |
证书到期监控——部署自动续期还不够,你得知道它真的续上了
自动续期机制配置好了,但不代表万无一失。DNS API密钥过期、Let's Encrypt服务端故障、crontab被误删、服务器时间不准——任何一个环节出问题,证书续期就会静默失败。等你发现的时候,用户已经看到"您的连接不是私密连接"的红色警告页了。
UptimeRobot SSL监控免费版可监控50个域名的SSL证书到期时间,提前30/14/7天发送邮件告警。适合站群规模50以内的场景。
acme.sh 自带通知acme.sh支持续期后执行自定义脚本,可以配置邮件、钉钉、企业微信通知。在acme.sh的--reloadcmd里加一行通知命令即可。
自建crontab巡检写一个Shell脚本,用openssl s_client检查所有域名的证书到期时间,小于15天就发告警。一劳永逸,适合站群100+的场景。
自建SSL到期巡检脚本(零成本,可监控任意数量域名)#!/bin/bash# 域名列表文件 ssl_domains.txt,一行一个域名DAYS_WARN=15while read domain; doexpiry=$(echo | openssl s_client -servername "$domain" -connect "$domain:443" 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)expiry_ts=$(date -d "$expiry" +%s)now_ts=$(date +%s)days_left=$(( ($expiry_ts - $now_ts) / 86400 ))if [ $days_left -lt $DAYS_WARN ]; thenecho "⚠️ $domain 证书还有 $days_left 天过期!" | mail -s "SSL证书即将过期" admin@example.comfidone < ssl_domains.txt# 加入crontab,每天凌晨2点跑一次# 0 2 * * * /path/to/ssl_check.sh
四个容易踩的坑,站群规模越大越容易犯
站群SSL部署的四个高频翻车点
坑一:Let's Encrypt频率限制——批量申请时被限速Let's Encrypt对同一个域名每周最多申请5次证书,每个账号每小时最多验证50次。如果你一次批量跑50个域名,前50个申请成功后,第51个开始会报错。解决方案:分批跑,每批不超过40个,批次之间间隔1小时。或者使用多个ACME账号(acme.sh支持--server参数切换到ZeroSSL或Buypass)。
坑二:DNS API密钥泄露或过期——续期静默失败DNS API密钥通常设置了有效期(Cloudflare API Token可以设过期时间,阿里云AccessKey可以禁用),密钥过期后acme.sh的DNS验证会失败,证书到期前60天触发续期时才发现续不上。解决方案:给DNS API密钥设个日历提醒,提前一个月检查;或者在证书到期前30天手动跑一次 acme.sh --renew --force 测试续期是否正常。
坑三:服务器时间不准——证书被视为"未生效"或"已过期"SSL证书验证依赖服务器系统时间。如果服务器时间偏差超过几分钟,可能导致新证书被认为"尚未生效"或已续期的证书被认为"已过期"。Nginx日志里出现 "certificate is not yet valid" 就是这个问题。解决方案:所有服务器配置NTP时间同步(ntpdate或chrony),这是服务器基础配置,但站群多了总有一两台漏掉的。
坑四:只配了443端口的证书,没配CDN的站群接入了CDN后,用户访问的是CDN边缘节点,不是源站服务器。你在源站更新了证书,CDN节点上还是旧证书——用户看到的过期警告不会消失。解决方案:如果用的是Certd,直接把CDN部署步骤加到流水线里;如果用acme.sh或宝塔,每次续期后手动或脚本更新CDN证书。阿里云CDN、腾讯云CDN都有API可以上传证书。

不同站群规模的最佳方案搭配
10个站点以内宝塔面板/1Panel 批量勾选→一键部署→完事。连命令行都不用开。证书到期提醒:宝塔内置+手机日历备忘
10-50个站点acme.sh + Shell批量脚本,配合Cloudflare DNS API。一次写好循环脚本,加新域名时在domains.txt里加一行重新跑。证书到期提醒:UptimeRobot SSL监控(免费50个)
50-200个站点Certd Docker部署,Web界面流水线管理。需要部署到CDN的站点走Certd的云平台插件。证书到期提醒:Certd内置通知 + 自建crontab巡检脚本
200个站点以上acme.sh + 自建管理系统 + 多ACME账号轮换。需要关注Let's Encrypt的速率限制,必要时切换到ZeroSSL和Google Trust Services分担。证书到期提醒:自建SSL巡检脚本 + Prometheus + Grafana仪表盘
站群SSL批量部署,说到底是把"每90天手动给每个域名点一遍申请按钮"这个动作自动化掉。acme.sh 一个命令 + 一个crontab就能做到的事,不要再手动搞了。三个关键动作:选一个工具(acme.sh命令行或Certd Web界面二选一)、配好DNS API(一次性配置,永久复用)、加一道证书到期监控(别太信任自动续期,加个保险)。三个动作做完,你的站群SSL就进入"配完就忘"的状态了——每90天自动续、过期前自动通知、出问题了你知道而不是用户先发现。
