腾讯云CDN自动更新Acme.sh证书

致谢:本文是对 Noam’s Blog 的优化

Background

  1. SSL证书强制3个月失效
  2. 不用腾讯云DNS就不能自动更新CDN证书,需要手动加DNS解析或者上传文件
  3. 我有很多域名
  4. 每个月都要手动更新,很烦人

技术方案

  1. acme.sh 自动签发证书
  2. 腾讯云 tccli 命令行工具自动上传、绑定证书
  3. acme.shinstall-cert 功能,在 reload-cmd 上传证书。
  4. 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

发表评论

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

退出移动版