使用acme.sh申请Let’s Encrypt SSL证书自动上传到阿里云CDN

由于上游SSL证书服务商政策的改变,阿里云CDN已经不再支持申请免费SSL证书了,有Let’s Encrypt这样方便好用的证书服务可以使用,我们没理由购买付费的SSL,只需要稍微在服务器上设置一下,就可以让acme.sh 帮我们申请 Let’s Encrypt 免费SSL证书,并可以通过 renew-hook 设置自动续签功能。下面我们来看一下具体的步骤。

一、在服务器上安装阿里云CLI

阿里云CLI可以让我们很方便地上传SSL证书到阿里云,我们只需要按照阿里云官方文档来操作就可以很轻松地安装阿里云CLI。

二、设置自动上传证书的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=(
    "www.haoruanmao.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 www.haoruanmao.com

搞定了上面的配置,再设置一个Cron任务,就可以让 acme.sh 自动帮我们续签证书并自动上传的阿里云,然后在CDN中使用了,只要服务器不停机,阿里云的 Key 和 Secret 不改变,理论上证书就会一直有效,非常方便非常高效。

THE END