使用 acme.sh 申请免费泛解析SSL 证书并自动续签以及部署

一、项目简介

  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、注册 ZeroSSL 账户

第1步,访问 ZeroSSL 开发者页面 获取 EAB 凭证(KID + HMAC Key) https://app.zerossl.com/developer

 

第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
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_KeyCF_Email
阿里云 DNS dns_ali Ali_KeyAli_Secret
华为云 DNS dns_huawei HUAWEICLOUD_UsernameHUAWEICLOUD_Password