由于上游SSL證書服務(wù)商政策的改變,阿里云CDN已經(jīng)不再支持申請(qǐng)免費(fèi)SSL證書了,有Let’s Encrypt這樣方便好用的證書服務(wù)可以使用,我們沒(méi)理由購(gòu)買付費(fèi)的SSL,只需要稍微在服務(wù)器上設(shè)置一下,就可以讓acme.sh 幫我們申請(qǐng) Let’s Encrypt 免費(fèi)SSL證書,并可以通過(guò) renew-hook 設(shè)置自動(dòng)續(xù)簽功能。下面我們來(lái)看一下具體的步驟。
一、在服務(wù)器上安裝阿里云CLI
阿里云CLI可以讓我們很方便地上傳SSL證書到阿里云,我們只需要按照阿里云官方文檔來(lái)操作就可以很輕松地安裝阿里云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
安裝后,運(yùn)行 aliyun configure 命令,按要求輸入 AccessKey ID、AccessKey Secret、Region Id 這些信息,配置好后可以通過(guò)運(yùn)行 aliyun configure list 命令來(lái)驗(yàn)證是否安裝成功。
二、設(shè)置自動(dòng)上傳證書的Renew Hook腳本
直接復(fù)制下面的代碼為可執(zhí)行文件,修改其中的阿里云key和需要續(xù)簽證書的域名,放在服務(wù)器上合適的位置(示例代碼中為/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 腳本:自動(dòng)將新證書上傳至阿里云并更新對(duì)應(yīng) CDN 域名,然后刪除對(duì)應(yīng)域名的舊證書。
# 每次 API 執(zhí)行都會(huì)檢測(cè)是否失敗,如果失敗,會(huì)中斷腳本執(zhí)行并返回自定義錯(cuò)誤代碼。
# RIBO: 修改為自己的 AccessKey
AliAccessKeyId="阿里云Access Key ID"
AliAccessKeySecret="阿里云 Access Key Secret"
# acme.sh 執(zhí)行 renewHook 時(shí)導(dǎo)出的環(huán)境變量列表
ACME_ENV_LIST=(
"CERT_KEY_PATH"
"CERT_FULLCHAIN_PATH"
"Le_Domain"
)
# 檢查環(huán)境變量是否存在
for value in "${ACME_ENV_LIST[@]}" ; do
[[ -v "$value" ]] || exit 1
done
unset value
# 獲取證書自定義函數(shù)
get_cert() {
# 使用 sed 刪除掉證書文件的空行
sed -e "/^$/d" "$CERT_FULLCHAIN_PATH"
}
# 獲取密鑰自定義函數(shù)
get_key() {
cat "$CERT_KEY_PATH"
}
# shellcheck disable=SC2154
DOMAIN=$Le_Domain
# 證書名稱 (替換域名的 . 為 _,以符合阿里云證書名稱規(guī)范)
CERT_NAME="${DOMAIN//./_}-$(date +%s)"
# 需要更新證書的 CDN 域名列表
# RIBO: 修改這里的 CDN 域名列表
DOMAIN_LIST=(
"cdn.wpzhiku.com"
)
# 設(shè)置 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
執(zhí)行SSL證書申請(qǐng)命令
首先,需要在命令行中 export 阿里云 key 和 secret 信息,只需執(zhí)行一次即可,acme.sh 會(huì)把這個(gè)信息記錄在 /root/.acme.sh/account.conf ,并在續(xù)簽證書時(shí)使用。
export Ali_Key="阿里云Access Key ID"
export Ali_Secret="阿里云 Access Key Secret"
執(zhí)行下面的命令,acme.sh 會(huì)在續(xù)簽 SSL 證書時(shí),自動(dòng)執(zhí)行 renew-hook 腳本(也就是cdnssl.sh),上傳續(xù)簽后的證書到阿里云。
acme.sh --issue --dns dns_ali -d cdn.wpzhiku.com --renew-hook /root/sh/cdnssl.sh
執(zhí)行成功后,在阿里云SSL證書后臺(tái)應(yīng)該可以看到自動(dòng)上傳的證書了,如果沒(méi)有看到,執(zhí)行一次續(xù)簽命令肯定就沒(méi)問(wèn)題了。
acme.sh --cron --home "/usr/local/acme.sh" > /dev/null
查看 acme.sh 的配置信息
使用下面的命令可以查看并驗(yàn)證 acme.sh 自動(dòng)記錄的用于在續(xù)簽SSL使用的配置信息。
acme.sh --info -d cdn.wpzhiku.com
搞定了上面的配置,再設(shè)置一個(gè)Cron任務(wù),就可以讓 acme.sh 自動(dòng)幫我們續(xù)簽證書并自動(dòng)上傳的阿里云,然后在CDN中使用了,只要服務(wù)器不停機(jī),阿里云的 Key 和 Secret 不改變,理論上證書就會(huì)一直有效,非常方便非常高效。



AliAccessKeyId=”阿里云Access Key ID”
AliAccessKeySecret=”阿里云 Access Key Secret”
這兩句已經(jīng)不需要了,你現(xiàn)在使用的是阿里云 CLI。原作者需要導(dǎo)入 sdk,所以才需要 AccessKey。