统一SSL证书批量绑定多跨境站点教程
如果你手里有多个面向不同国家的跨境站点,希望让它们都使用 HTTPS,又不想一个个去申请证书,那一张通配符 SSL 证书配合批量绑定操作就能省下大量时间。
这篇文章带你从头走一遍:从申请证书到批量配置站点,再到验证和避坑,全部基于实际场景,保证零基础也能按步骤完成。
准备工作
在开始之前,确保已经满足以下条件:
- 服务器上安装了 Nginx(如果用宝塔面板,本质也是 Nginx),并开放了 80 和 443 端口。
- 所有站点的域名都解析到了这台服务器的 IP。假设你有一个主域名 example.com,其他站点是 site1.example.com、site2.example.com 等形式。
- 拥有服务器 root 权限(或能执行 sudo 命令)。如果是宝塔面板,需要能通过 SSH 执行命令行,或者能用面板的文件管理功能。
- 决定要使用的证书类型:推荐 Let's Encrypt 通配符证书(免费,自动续期),或者商业通配符证书。本文以 Let's Encrypt 为例。
第一步:申请通配符 SSL 证书
使用 acme.sh 脚本申请证书是目前比较稳定的方式。
登录到服务器,执行以下命令安装 acme.sh:
curl https://get.acme.sh | sh -s email=your-email@example.com
安装完成后,配置 DNS API 自动验证(以 Cloudflare 为例,其他 DNS 服务商类似)。
先设置 Cloudflare 的 API Token:
export CF_Token="你的API Token"
export CF_Account_ID="你的账户ID"
然后申请通配符证书:
acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'
申请成功后,证书文件会存储在 ~/.acme.sh/example.com/ 目录下。
我们需要把它们复制到 Nginx 统一使用的路径:
mkdir -p /etc/ssl/example/
cp ~/.acme.sh/example.com/fullchain.cer /etc/ssl/example/fullchain.cer
cp ~/.acme.sh/example.com/example.com.key /etc/ssl/example/example.com.key
注意:让证书文件对所有用户可读(chmod 644),或者确保 Nginx 用户(通常是 www-data)有权读取。
第二步:批量配置 Nginx 站点使用同一证书
如果你使用纯 Nginx,每个站点的配置文件通常放在 /etc/nginx/sites-available/ 下。
打开每个站点的 server 块,修改 SSL 配置部分:
server {
listen 443 ssl;
server_name site1.example.com;
ssl_certificate /etc/ssl/example/fullchain.cer;
ssl_certificate_key /etc/ssl/example/example.com.key;
# 其余配置(root, index 等)保持不变
}
如果站点数量很多,可以用一行 sed 命令批量替换。
例如,假设所有站点配置中都还没有 SSL 配置,可以统一添加:
cd /etc/nginx/sites-available/
for file in *; do
if grep -q 'listen 443' "$file"; then
echo "$file 已有 SSL 配置,跳过"
else
# 在文件末尾追加 SSL 配置块(需要依据实际情况调整)
cat >> "$file" <
之后检查 Nginx 配置是否正确:
nginx -t
如果没问题,重启 Nginx:
systemctl reload nginx
如果你使用的是 宝塔面板,可以通过 SSH 直接修改 /www/server/panel/vhost/nginx/ 下的站点配置文件。
宝塔每个站点独立一个 .conf 文件,用 sed 批量修改 SSL 证书路径即可:
cd /www/server/panel/vhost/nginx/
sed -i "s|ssl_certificate .*|ssl_certificate /etc/ssl/example/fullchain.cer;|" *.conf
sed -i "s|ssl_certificate_key .*|ssl_certificate_key /etc/ssl/example/example.com.key;|" *.conf
修改后同样需要在宝塔面板中重启 Nginx 服务。
第三步:自动续期与避坑指南
Let's Encrypt 证书有效期 90 天,acme.sh 会自动添加 cron 任务续期。
但续期后需要重载 Nginx 让新证书生效。
如果自动重载没生效,可以手动添加一条命令到 cron:
acme.sh --renew -d example.com --dns dns_cf | bash
nginx -t && systemctl reload nginx
常见避坑:
- 通配符证书仅能覆盖一级子域名。比如
*.example.com可以保护site1.example.com,但不能保护sub.site1.example.com。如果跨境站点有多级域名,需要单独申请对应证书。 - 证书文件权重要确保 Nginx 能读取。如果重启后报
permission denied,检查文件权限:chmod 644 /etc/ssl/example/*。 - DNS 验证失败:检查 API Token 是否有足够权限,或使用手动添加 TXT 记录的方式。
- 配置语法错误:批量修改后一定执行
nginx -t再重载,避免整个 Nginx 崩溃。
第四步:验证效果
用 curl 测试每个站点的 HTTPS 连接,确保返回 200 状态码且证书信息正确:
curl -I https://site1.example.com
输出中应出现 HTTP/2 200 并带有 SSL 相关响应头。
也可以直接打开浏览器访问 https://site1.example.com,点击地址栏锁图标查看证书详情,确认颁发给 *.example.com。
高频问题解答
Q:如果站点多了,手动修改配置太慢怎么办?
A:可以先写一个通用配置文件只包含 SSL 设置,然后用 include 语句在每个站点配置中引用。或者使用 Ansible、SaltStack 等自动化工具。
Q:商业通配符证书也能这样批量绑定吗?
A:可以,只需把证书和密钥文件放在统一路径,然后在 Nginx 配置中引用即可,原理完全相同。
Q:证书续期后是否需要逐个重新绑定?
A:不需要,因为你已经把证书路径写死到 Nginx 配置中。续期后覆盖相同路径的文件,再重载 Nginx 即可。
Q:我在宝塔面板的「网站」设置里看不到证书共用选项?
A:宝塔面板目前不支持在 UI 上直接为多个站点绑定同一证书,必须通过修改配置文件实现。本文提供的 sed 方法可以帮你快速完成。
如果你遇到了本文未覆盖的异常情况,建议先检查 Nginx 错误日志(/var/log/nginx/error.log)和证书文件路径是否正确。
一次性搞定多个站点的 HTTPS,这个操作值得收藏。