指北:使用 acme.sh 实现多域名泛域名证书自动管理
2025年12月30日 · 847 字 · 2 分钟
在管理多站点云服务器时,为每个域名单独申请和维护证书既繁琐又容易出错。本文将介绍如何利用 acme.sh 的强大功能,将多个域名(含泛域名)整合进一张 ECC 证书中,并实现全自动续期与分发。
1. 核心思路:SAN 证书与自动化闭环
与其为 122103.xyz 和 920428.xyz 分别维护两套证书,不如申请一张 SAN (Subject Alternative Name) 证书。
优势:
- 统一管理:Nginx 只需加载一套
.pem文件,减少配置冗余。 - 自动续期:通过 API 自动完成 DNS 挑战,无需手动添加解析记录。
- 无缝衔接:续期成功后自动重启 Docker 容器,实现真正的无人值守。
2. 准备工作
本文以 Cloudflare 作为 DNS 服务商为例,你需要准备:
- CF_Key: 你的 Cloudflare Global API Key。
- CF_Email: 你的 Cloudflare 账号邮箱。
3. 全自动化运维脚本
通过一个脚本完成“申请、安装、配置、巡检”四个核心动作。
#!/bin/bash
# 脚本路径建议: /root/nginx/cert_refresh.sh
# 1. 身份鉴权配置
export CF_Key="你的_Global_API_Key"
export CF_Email="你的_账号邮箱"
# 2. 域名规划
# 将多个主域名及其泛域名写在一起
DOMAINS="-d 122103.xyz -d *.122103.xyz -d 920428.xyz -d *.920428.xyz"
PRIMARY_DOMAIN="122103.xyz" # 证书索引名称
# 3. 路径与工具定义
ACME_BIN="bash /root/.acme.sh/acme.sh" # 推荐显式指定 bash 引导
CERT_SAVE_PATH="/root/nginx/cert"
echo ">>> 开始证书自动化流程..."
# Step 1: 申请 ECC 证书
# ECC 证书比 RSA 更快更安全,letsencrypt 则是目前最主流的免费 CA
$ACME_BIN --issue --dns dns_cf $DOMAINS --server letsencrypt --keylength ec-256 --force
# Step 2: 安装并建立分发链路
# install-cert 命令会记录路径,以便未来自动续期时能准确覆盖文件
$ACME_BIN --install-cert -d "$PRIMARY_DOMAIN" --ecc \
--key-file "$CERT_SAVE_PATH/privkey.pem" \
--fullchain-file "$CERT_SAVE_PATH/fullchain.pem" \
--reloadcmd "docker restart nginx"
# Step 3: 配置定时巡检任务
# 该命令会将续期任务写入 crontab,建议手动检查确保其以 bash 方式运行
$ACME_BIN --install-cronjob
echo ">>> 流程执行完毕。"
4. Nginx 配置实践
由于我们使用了 SAN 证书,Nginx 的配置变得异常简洁。你可以在不同的 server 块中复用同一套证书路径:
server {
listen 443 ssl;
server_name 122103.xyz *.122103.xyz;
ssl_certificate /etc/nginx/cert/fullchain.pem;
ssl_certificate_key /etc/nginx/cert/privkey.pem;
# ... 其他配置
}
server {
listen 443 ssl;
server_name 920428.xyz *.920428.xyz;
ssl_certificate /etc/nginx/cert/fullchain.pem;
ssl_certificate_key /etc/nginx/cert/privkey.pem;
# ... 其他配置
}
5. 进阶技巧:如何确认证书生效?
脚本运行后,你可以通过 openssl 快速查看证书中包含的所有域名条目,确保泛域名已正确绑定:
openssl x509 -in /root/nginx/cert/fullchain.pem -text -noout | grep DNS
输出示例:
DNS:122103.xyz, DNS:*.122103.xyz, DNS:920428.xyz, DNS:*.920428.xyz
6. 结语
acme.sh 的强大不仅在于它能申请证书,更在于它能通过 --install-cert 记住你的运维习惯。只要第一次配置正确,往后数年的证书维护工作都将“隐形”。