由于上游SSL证书服务商政策的改变,阿里云CDN已经不再支持申请免费SSL证书了,有Let’s Encrypt这样方便好用的证书服务可以使用,我们没理由购买付费的SSL,只需要稍微在服务器上设置一下,就可以让acme.sh 帮我们申请 Let’s Encrypt 免费SSL证书,并可以通过 renew-hook 设置自动续签功能。下面我们来看一下具体的步骤。
一、在服务器上安装阿里云CLI
阿里云CLI可以让我们很方便地上传SSL证书到阿里云,我们只需要按照阿里云官方文档来操作就可以很轻松地安装阿里云CLI。
wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz \
&& tar xzvf aliyun-cli-linux-latest-amd64.tgz \
&& chmod +x aliyun \
&& cp aliyun /usr/local/bin
安装后,通过运行 aliyun version
命令来验证是否安装成功。
二、设置自动上传证书的Renew Hook脚本
直接复制下面的代码为可执行文件,修改其中的阿里云key和需要续签证书的域名,放在服务器上合适的位置(示例代码中为/root/sh/cdnssl.sh)即可。
#!/usr/bin/env bash
# 使用的 OpenAPI
# CAS: https://help.aliyun.com/document_detail/126507.html
# CDN:https://help.aliyun.com/document_detail/106661.html
# 可配合 acme.sh 使用的 renewHook 脚本:自动将新证书上传至阿里云并更新对应 CDN 域名,然后删除对应域名的旧证书。
# 每次 API 执行都会检测是否失败,如果失败,会中断脚本执行并返回自定义错误代码。
# RIBO: 修改为自己的 AccessKey
AliAccessKeyId="阿里云Access Key ID"
AliAccessKeySecret="阿里云 Access Key Secret"
# acme.sh 执行 renewHook 时导出的环境变量列表
ACME_ENV_LIST=(
"CERT_KEY_PATH"
"CERT_FULLCHAIN_PATH"
"Le_Domain"
)
# 检查环境变量是否存在
for value in "${ACME_ENV_LIST[@]}" ; do
[[ -v "$value" ]] || exit 1
done
unset value
# 获取证书自定义函数
get_cert() {
# 使用 sed 删除掉证书文件的空行
sed -e "/^$/d" "$CERT_FULLCHAIN_PATH"
}
# 获取密钥自定义函数
get_key() {
cat "$CERT_KEY_PATH"
}
# shellcheck disable=SC2154
DOMAIN=$Le_Domain
# 证书名称 (替换域名的 . 为 _,以符合阿里云证书名称规范)
CERT_NAME="${DOMAIN//./_}-$(date +%s)"
# 需要更新证书的 CDN 域名列表
# RIBO: 修改这里的 CDN 域名列表
DOMAIN_LIST=(
"cdn.wpzhiku.com"
)
# 设置 CDN 域名列表使用新的证书
for _domain in "${DOMAIN_LIST[@]}"; do
aliyun cdn SetCdnDomainSSLCertificate --DomainName "$_domain" --SSLPub="$(get_cert)" --SSLPri="$(get_key)" --CertType upload --SSLProtocol on || exit 103
done
unset _domain
执行SSL证书申请命令
首先,需要在命令行中 export 阿里云 key 和 secret 信息,只需执行一次即可,acme.sh 会把这个信息记录在 /root/.acme.sh/account.conf ,并在续签证书时使用。
export Ali_Key="阿里云Access Key ID"
export Ali_Secret="阿里云 Access Key Secret"
执行下面的命令,acme.sh 会在续签 SSL 证书时,自动执行 renew-hook 脚本(也就是cdnssl.sh),上传续签后的证书到阿里云。
acme.sh --issue --dns dns_ali -d cdn.wpzhiku.com --renew-hook /root/sh/cdnssl.sh
执行成功后,在阿里云SSL证书后台应该可以看到自动上传的证书了,如果没有看到,执行一次续签命令肯定就没问题了。
acme.sh --cron --home "/usr/local/acme.sh" > /dev/null
查看 acme.sh 的配置信息
使用下面的命令可以查看并验证 acme.sh 自动记录的用于在续签SSL使用的配置信息。
acme.sh --info -d cdn.wpzhiku.com
搞定了上面的配置,再设置一个Cron任务,就可以让 acme.sh 自动帮我们续签证书并自动上传的阿里云,然后在CDN中使用了,只要服务器不停机,阿里云的 Key 和 Secret 不改变,理论上证书就会一直有效,非常方便非常高效。
2 thoughts on “使用acme.sh申请Let’s Encrypt SSL证书并自动上传到阿里云CDN”
AliAccessKeyId=”阿里云Access Key ID”
AliAccessKeySecret=”阿里云 Access Key Secret”
这两句已经不需要了,你现在使用的是阿里云 CLI。原作者需要导入 sdk,所以才需要 AccessKey。
谢谢指正!