基于 acme.sh 与火山引擎 API 自动化签发 SSL 通配符证书

核心痛点

acme.sh 官方原生暂未内置火山引擎(VolcEngine)的 DNS 供应商插件。若要通过 DNS 验证(DNS-01挑战)申请泛域名/通配符证书,我们需要引入第三方的 DNS API 扩展脚本。本文将基于开源项目 mitkimi/acmesh_volcengine_api,完整演示从安装、配置到自动化部署的全流程。

2026-6-6 可用

环境准备与 acme.sh 安装

首先安装 acme.sh。建议绑定您的常用邮箱,以便在证书即将过期且自动续期失败时收到 Let's Encrypt 的邮件提醒。Bash

# 方案 A:指定邮箱安装(推荐)
curl https://get.acme.sh | sh -s email=your_email@example.com

# 方案 B:匿名安装
curl https://get.acme.sh | sh

安装完成后,使环境变量生效并验证版本:

source ~/.bashrc
acme.sh --version

配置火山引擎 API 密钥与插件

3.1 获取 API 凭证

登录火山引擎控制台,前往 访问控制 -> API访问密钥 -> 密钥列表 -> 新建密钥,获取 AccessKey IDSecret AccessKey

3.2 注入环境变量

直接在当前 Shell 终端中执行以下命令(无需写入 .bashrc)。

安全提示acme.sh 在首次签发成功后,会将这两个密钥自动加密持久化至 ~/.acme.sh/account.conf 中。未来 crontab 定时任务自动续期时会自动调用该配置,因此无需在全局配置文件中常驻明文密钥。
export VOLCENGINE_ACCESS_KEY_ID="您的AccessKeyID"
export VOLCENGINE_SECRET_ACCESS_KEY="您的SecretAccessKey"

3.3 下载第三方火山引擎 DNS 插件

下载由作者 mitkimi 编写的外部 DNS 脚本,并放置到 acme.sh 的插件目录中:Bash

# 下载原始脚本(注意:必须使用 raw 域名链接)
curl -sSfL https://raw.githubusercontent.com/mitkimi/acmesh_volcengine_api/main/dns_volcengine.sh \
    > ~/.acme.sh/dnsapi/dns_volcengine.sh

# 赋予可执行权限
chmod +x ~/.acme.sh/dnsapi/dns_volcengine.sh

申请 SSL 证书

执行以下命令开始申请证书。此处以 liangzhantu.fun 为例,同时申请主域名与泛域名。Bash

# 首次申请证书
acme.sh --issue --dns dns_volcengine -d yourdomain.com -d '*.yourdomain.com'

# 如果需要强制重新签发或调试,可追加 --force 和 --debug 参数
acme.sh --issue --dns dns_volcengine -d yourdomain.com -d '*.yourdomain.com' --force --debug

提取证书与自动化运维(以 Nginx 容器为例)

切勿直接将 Nginx 的配置文件指向 ~/.acme.sh/ 目录下的原始文件,该目录结构内部可能会发生变动。正确的做法是使用 --install-cert 命令将证书复制到指定的生产目录,并通过 --reloadcmd 设定自动化重载钩子。Bash

# 创建证书存储目录(此处以 /etc/nginx/ssl/ 为例,可根据实际情况修改)
mkdir -p /etc/nginx/ssl/yourdomain.com/

# 提取证书并配置容器重载
acme.sh --install-cert -d <yourdomain.com> --ecc \
  --key-file       /etc/nginx/ssl/yourdomain.com/yourdomain.com.key \
  --fullchain-file /etc/nginx/ssl/yourdomain.com/yourdomain.com.pem \
  --reloadcmd      "docker exec <nginx-name> nginx -s reload"

关于未来的自动化续期

acme.sh 在安装时已自动向系统的 crontab 注入了定时任务。你可以通过以下命令查看:

crontab -l

输出中k'n可能会包含一条类似以下的内容:

56 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

自动化续期的运行逻辑:

  1. 每晚定时任务触发。
  2. acme.sh 检查证书,若证书有效期少于 30 天,则触发续期。
  3. acme.sh 自动读取 ~/.acme.sh/account.conf 中保存的火山引擎密钥,通过 API 自动到域名解析中添加 TXT 记录。
  4. 验证通过后,新证书生成。
  5. 自动执行 --reloadcmd 绑定的命令(例如 docker exec ... nginx -s reload),整个过程无感、零人工干预。