Black Android Smartphone on Top of White Book

使用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。

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 configure 命令,按要求输入 AccessKey ID、AccessKey Secret、Region Id 这些信息,配置好后可以通过运行 aliyun configure list 命令来验证是否安装成功。

二、设置自动上传证书的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 不改变,理论上证书就会一直有效,非常方便非常高效。

Related Posts

0条评论

  1. AliAccessKeyId=”阿里云Access Key ID”
    AliAccessKeySecret=”阿里云 Access Key Secret”
    这两句已经不需要了,你现在使用的是阿里云 CLI。原作者需要导入 sdk,所以才需要 AccessKey。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注