一、项目简介
acme.sh 是一款纯 Shell 脚本实现的 ACME 协议客户端,用于自动申请、续签 SSL 证书(支持 Let’s Encrypt、ZeroSSL 等 CA)。本文档旨在实现:
- ✅ 自动申请泛域名 SSL 证书(通配符证书)
- ✅ 基于 DNSPod API 的 DNS 验证
- ✅ 自动续期(无需人工干预)
- ✅ 自动部署至 Nginx 并重载服务
一键部署脚本:https://gitee.com/cncsrf/acme.sh-DNSPod-OneKey
二、安装 acme.sh
1. 安装 acme.sh
方法一:直接安装(推荐)
curl https://get.acme.sh | sh
source ~/.bashrc
方法二:国内镜像安装(备用)
wget https://gitee.com/neilpang/acme.sh/repository/archive/master.zip
unzip master.zip
cd acme.sh-master/
./acme.sh --install
source ~/.bashrc
进入安装目录:
- Root 用户:
/root/.acme.sh/ - 普通用户:
~/.acme.sh/
三、配置 ZeroSSL(默认 CA)
1、设置 ZeroSSL 为默认 CA
./acme.sh --set-default-ca --server zerossl

第2步,运行注册命令:
./acme.sh --register-account -m your_email@example.com \
--server https://acme.zerossl.com/v2/DV90 \
--eab-kid "你的EAB_KID" \
--eab-hmac-key "你的EAB_HMAC_KEY"
四、使用 DNSPod API 申请证书
1、获取 DNSPod API 密钥
- 登录 DNSPod 控制台 https://console.dnspod.cn/account/token/token
- 获取
DP_Id(API ID)和DP_Key(API Token)。
2、申请证书(单域名示例)
在终端运行以下命令(临时生效,或写入 ~/.bashrc 永久生效):
export DP_Id="你的DNSPOD_ID"
export DP_Key="你的DNSPOD_TOKEN"
./acme.sh --issue --dns dns_dp -d huaxi.us -d *.huaxi.us
或者直接在执行
acme.sh 时带上:DP_Id="5***9" DP_Key="1**********c" ./acme.sh --issue --dns dns_dp -d huaxi.us -d *.huaxi.us
流程说明:
acme.sh会自动调用 DNSPod API,添加_acme-challenge.huaxi.us的 TXT 记录。- 等待 DNS 生效(自动检测)。
- 完成验证后,自动删除临时 TXT 记录,并颁发证书。


五、证书存储与自动续期
1、证书默认路径
/root/.acme.sh/huaxi.us/
├── huaxi.us.key # 私钥
├── huaxi.us.cer # 证书
└── huaxi.us.fullchain.cer # 完整证书链
2、检查自动续期状态
acme.sh 默认会自动续签证书(每 60 天 自动检查并续期),但前提是:DNS API 配置正确(如 DNSPod的 API 密钥有效)
acme.sh 的定时任务(Cron)正常运行./acme.sh --list # 查看证书续期时间
crontab -l # 检查定时任务(默认每天检查续期)

Renew列 显示下次续期时间(默认 60 天后)。
3、手动测试续期
如果想 立即测试 自动续期是否正常,可以强制续签:
./acme.sh --renew -d huaxi.us --force
--force:强制续期(即使未到期)。- 如果成功,说明自动续期配置正确。

六、自动部署证书到 Nginx
默认情况下,
acme.sh 只续签证书文件(存放在 ~/.acme.sh/huaxi.us/),不会自动更新到 Nginx/Apache 等服务器。1、申请时直接配置自动部署
在申请证书时,可以加
--reloadcmd 让续期后自动重启 Web 服务:./acme.sh --issue --dns dns_dp -d huaxi.us \
--key-file /etc/nginx/ssl/huaxi.us.key \
--fullchain-file /etc/nginx/ssl/huaxi.us.cer \
--reloadcmd "systemctl reload nginx"
2、为已有证书添加自动部署
如果证书已申请,可以用
--install-cert 添加自动部署:./acme.sh --install-cert -d huaxi.us \
--key-file /etc/nginx/ssl/huaxi.us.key \
--fullchain-file /etc/nginx/ssl/huaxi.us.cer \
--reloadcmd "systemctl reload nginx"
七、 常见问题
Q1:自动续期失败?
- 检查日志:
cat ~/.acme.sh/acme.sh.log | grep "huaxi.us"
- 可能原因:
- DNS API 密钥失效 → 重新配置
DP_Id和DP_Key。 - 未使用 DNS API 模式 → 重新申请证书(
--dns dns_dp)。 - Cron 未运行 → 检查
crontab -l。
- DNS API 密钥失效 → 重新配置
Q2:如何关闭自动续期?
./acme.sh --remove -d example.com # 删除单域名任务
crontab -e # 手动删除 Cron 任务
八、使用 Let’s Encrypt 申请通配符证书
1、 设置默认 CA 为 Let’s Encrypt
Let’s Encrypt 无需注册 EAB 凭证,直接设置即可:
./acme.sh --set-default-ca --server letsencrypt
2、 使用 DNSPod API 申请泛域名证书
export DP_Id="你的DNSPOD_ID"
export DP_Key="你的DNSPOD_TOKEN"
./acme.sh --issue --dns dns_dp -d "*.huaxi.us" -d huaxi.us --force

3 、自动部署证书到 Nginx
./acme.sh --install-cert -d "*.huaxi.us" \
--key-file /etc/nginx/ssl/huaxi.us.key \
--fullchain-file /etc/nginx/ssl/huaxi.us.cer \
--reloadcmd "systemctl reload nginx"
4 、验证证书
openssl x509 -in /etc/nginx/ssl/huaxi.us.cer -noout -text | grep "Subject:"
预期输出:
Subject: CN = *.huaxi.us
5 、添加计划任务
crontab -e
# 添加以下行(每天凌晨 0:05 执行)
5 0 * * * "/root/.acme.sh/acme.sh" --cron --home "/root/.acme.sh" > /dev/null
6 、如何重新申请正确的通配符证书
步骤 1:查看现有证书
./acme.sh --list
步骤 2:删除旧的单域名证书(可选)
./acme.sh --remove -d huaxi.us
Let’s Encrypt 与 ZeroSSL 对比
| 项目 | ZeroSSL | Let’s Encrypt |
|---|---|---|
| 注册账户 | 需要 EAB 凭证 | 无需注册 |
| 证书有效期 | 90 天 | 90 天 |
| 泛域名支持 | ✅ 支持 | ✅ 支持 |
| 申请复杂度 | 略高 | 更低 |
7.总结
| 步骤 | 命令/操作 |
|---|---|
| 1. 安装 acme.sh | curl https://get.acme.sh | sh |
| 2. 配置 ZeroSSL | 注册 EAB 并设置默认 CA |
| 3. 申请证书 | ./acme.sh --issue --dns dns_dp -d example.com |
| 4. 自动续期 | 默认启用(检查 crontab -l) |
| 5. 自动部署 | 使用 --reloadcmd "systemctl reload nginx" 更新证书后重启服务 |
完整自动化:只要 DNS API 有效且 Cron 正常运行,续期无需手动干预!
附:其他 DNS 服务商 API 参考
| 服务商 | --dns 参数 |
环境变量 |
|---|---|---|
| Cloudflare | dns_cf |
CF_Key, CF_Email |
| 阿里云 DNS | dns_ali |
Ali_Key, Ali_Secret |
| 华为云 DNS | dns_huawei |
HUAWEICLOUD_Username, HUAWEICLOUD_Password |

