Skip to content

acme.sh 阿里云证书

这篇记录如何使用 acme.sh 配合阿里云 DNS API,自动签发 *.edwin.work 泛域名证书,并在证书更新后自动重载 Nginx。

准备工作

开始之前,需要先准备好:

  • 一个托管在阿里云 DNS 的域名,例如 edwin.work
  • 一个可用的阿里云 RAM 用户
  • RAM 用户的 AccessKey IDAccessKey Secret
  • 服务器上已安装并可正常运行的 Nginx

建议给 RAM 用户只授予 DNS 相关的最小权限,不要直接使用主账号的 AccessKey。

  • 需要 AliyunDNSFullAccess 权限,或者自定义一个权限策略只允许修改特定域名的 DNS 记录。

WARNING

不要在生产服务器上长期暴露高权限 AccessKey。建议使用最小权限 RAM 账号,并仅允许操作目标域名的 DNS 记录。

1. 安装 acme.sh

如果服务器还没有安装 acme.sh,可以执行:

bash
curl https://get.acme.sh | sh

安装完成后,刷新当前终端环境变量:

bash
source ~/.bash_profile

如果使用的是其他 Shell,也可以重新打开一个终端会话。

2. 配置阿里云 API

acme.sh 会通过阿里云 DNS API 自动添加 DNS 验证记录,因此需要先配置阿里云 AccessKey:

bash
export Ali_Key="你的AccessKeyID"
export Ali_Secret="你的AccessKeySecret"

为了让后续自动续期任务也能读取到这两个变量,可以把它们写入 ~/.bash_profile

bash
export Ali_Key="你的AccessKeyID"
export Ali_Secret="你的AccessKeySecret"

配置完成后,重新加载环境变量:

bash
source ~/.bash_profile

3. 选择证书 CA

acme.sh 默认可能会使用 ZeroSSL。首次使用 ZeroSSL 时,需要先完成 EAB 或邮箱注册:

bash
acme.sh --register-account -m your-email@example.com

如果希望改用 Let's Encrypt,可以将默认 CA 切换为 letsencrypt

bash
acme.sh --set-default-ca --server letsencrypt

切换完成后,后续签发和续期都会默认使用 Let's Encrypt

4. 签发泛域名证书

执行下面命令签发 *.edwin.work 与根域名 edwin.work 的证书:

bash
acme.sh --issue --dns dns_ali -d '*.edwin.work' -d 'edwin.work'

参数说明:

  • --dns dns_ali:使用阿里云 DNS API 进行域名验证
  • -d '*.edwin.work':签发泛域名证书
  • -d 'edwin.work':同时包含根域名

签发成功后,证书默认会保存在:

text
~/.acme.sh/<你的域名>/

5. 安装证书到 Nginx

先创建证书存放目录:

bash
mkdir -p /etc/pki/nginx

然后安装证书并配置自动重载:

bash
acme.sh --install-cert -d '*.edwin.work' --ecc \
	--key-file       /etc/pki/nginx/edwin.work.key \
	--fullchain-file /etc/pki/nginx/edwin.work.crt \
	--reloadcmd 'nginx -s reload'

参数说明:

  • --key-file:私钥保存路径
  • --fullchain-file:完整证书链保存路径
  • --reloadcmd:证书更新后自动执行的命令

这里的 --reloadcmd 使用 nginx -s reload,表示证书安装或续期成功后自动重载 Nginx。

TIP

将命令中的 edwin.work 替换成你的实际域名。

6. 自动续期

acme.sh 安装后通常会自动添加定时任务,用于定期检查并续期证书。

可以通过下面的命令查看:

bash
crontab -l

证书续期成功后,会自动执行前面配置的 --reloadcmd,因此一般不需要再额外配置 Nginx 重载逻辑。

7. 验证与检查

查看证书列表:

bash
acme.sh --list

手动触发续期测试:

bash
acme.sh --renew -d '*.edwin.work' --force

查看 Nginx 是否加载了新证书:

bash
openssl x509 -in /etc/pki/nginx/edwin.work.crt -noout -dates

补充:证书续期后自动同步到阿里云 CDN

如果域名开启了阿里云 CDN 加速,CDN 侧的 HTTPS 证书需要单独上传,否则续期后 CDN 仍会使用旧证书。

可以在 --install-cert--reloadcmd 中,同时完成 Nginx 重载与 CDN 证书更新:

bash
acme.sh --install-cert -d '*.edwin.work' --ecc \
  --key-file       /etc/pki/nginx/edwin.work.key \
  --fullchain-file /etc/pki/nginx/edwin.work.crt \
  --reloadcmd      '
    nginx -s reload

    aliyun cdn SetCdnDomainSSLCertificate \
      --SSLProtocol on \
      --CertType    upload \
      --DomainName  "file.edwin.work" \
      --CertName    "file.edwin.work--$(date +%Y%m%d)" \
      --SSLPri      "$(cat /etc/pki/nginx/edwin.work.key)" \
      --SSLPub      "$(cat /etc/pki/nginx/edwin.work.crt)"
  '

参数说明:

  • --CertType upload:以上传方式推送证书,无需在阿里云控制台手动导入
  • --CertName:证书名称,附加日期后缀方便区分每次续期
  • --SSLPub:完整证书链内容(对应 --fullchain-file
  • --SSLPri:私钥内容(对应 --key-file

NOTE

aliyun CLI 需要提前安装并配置好具有 CDN 写权限的 AccessKey。建议为 CDN 操作单独创建 RAM 用户,授予 AliyunCDNFullAccess 或自定义的最小 CDN 证书上传权限。

如果有多个 CDN 域名需要同步,可以在 --reloadcmd 中重复调用 aliyun cdn SetCdnDomainSSLCertificate,每个域名一条命令。