致谢:本文是对 Noam’s Blog 的优化
Background
- SSL证书强制3个月失效
- 不用腾讯云DNS就不能自动更新CDN证书,需要手动加DNS解析或者上传文件
- 我有很多域名
- 每个月都要手动更新,很烦人
技术方案
acme.sh
自动签发证书- 腾讯云
tccli
命令行工具自动上传、绑定证书 - 用
acme.sh
的install-cert
功能,在reload-cmd
上传证书。 acme.sh
会 自动更新 并调用reload-cmd
上传、绑定。
特别注意:因为使用DNS签发,所以我选择了一个中央服务器负责所有CDN证书的签发。即 CDN证书与源站证书的解耦。
脚本
上传脚本
注意权限问题
sudo mkdir -p /opt/tencentcdn/
sudo chown $(whoami) /opt/tencentcdn/ -R
touch /opt/tencentcdn/upload_cert.sh && chmod +x /opt/tencentcdn/upload_cert.sh
写入以下内容
#!/bin/bash
domain_name=$1
# /opt/tencentcdn 是我自己选择的目录。
# 同时cert_path和key_path也是我自己选择的命名方法。
# 可以按照自己需求调整
base_dir="/opt/tencentcdn/${domain_name}_ecc"
cert_path="${base_dir}/fullchain.cer"
key_path="$base_dir/${domain_name}.key"
# 上传(禁止重复上传,重复时返回已存在的ID)
resp=$(tccli ssl UploadCertificate --cli-unfold-argument --CertificatePublicKey "$(cat ${cert_path})" --CertificatePrivateKey "$(cat ${key_path})" --Repeatable false)
echo $resp
cert_id=$(echo $resp | grep -oP '"CertificateId":\s*"\K[^"]+')
echo $cert_id
# 遍历域名列表,选中域名更新
for domain in $(tccli cdn DescribeDomains --cli-unfold-argument --endpoint cdn.ap-beijing.tencentcloudapi.com --Filters.0.Name status --Filters.0.Value online | grep -oP '"Domain":\s*"\K[^"]+'); do
if [[ $domain == ${domain_name} ]]; then
echo update online cdn domain deployment $domain
tccli cdn ModifyDomainConfig --cli-unfold-argument --Domain "$domain" --Route 'Https.CertInfo.CertId' --Value "{\"update\":\"$cert_id\"}"
fi
done
echo done
签发脚本
touch /opt/tencentcdn/issue_cert.sh && chmod +x /opt/tencentcdn/issue_cert.sh
写入以下内容
#!/bin/bash
domain_name=$1
acme="${HOME}/.acme.sh/acme.sh"
mkdir -p /opt/tencentcdn/${domain_name}_ecc
$acme --issue --dns dns_cf -d ${domain_name} --keylength ec-384 # 我使用了 Cloudflare DNS,使用其他厂商的在这里改
$acme --install-cert -d ${domain_name} --ecc \
--fullchain-file /opt/tencentcdn/${domain_name}_ecc/fullchain.cer \
--key-file /opt/tencentcdn/${domain_name}_ecc/${domain_name}.key \
--reloadcmd "/opt/tencentcdn/upload_cert.sh ${domain_name}"
使用方法
/opt/tencentcdn/issue_cert.sh example.com