Appearance
acme.sh 阿里云证书
这篇记录如何使用 acme.sh 配合阿里云 DNS API,自动签发 *.edwin.work 泛域名证书,并在证书更新后自动重载 Nginx。
准备工作
开始之前,需要先准备好:
- 一个托管在阿里云 DNS 的域名,例如
edwin.work - 一个可用的阿里云 RAM 用户
- RAM 用户的
AccessKey ID和AccessKey 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_profile3. 选择证书 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,每个域名一条命令。