使用 acme.sh 自动签发 letsencrypt 证书并部署到七牛云融合 CDN

七牛融合 cdn 域名需要 ssl 证书,七牛免费的一年期证书快到期了,正好 letsencrypt 可以提供免费证书,我考虑把证书换成 letsencrypt 证书。letsencrypt 证书有效期三个月,需要定期更新并上传到七牛,于是我开始寻找自动更新 letsencrypt 证书并上传到七牛的方法,搜了一圈,发现使用 Neilpang/acme.sh 这个工具就可以完成这个自动化过程。过程中需要使用 DNS 服务商的接口支持。

用 acme.sh 签发证书

安装 acme.sh

一句话命令:
curl https://get.acme.sh | sh
安装完之后需要重新打开终端来使 alias 生效,或者手动刷新,比如用 zsh 的:source ~/.zshrc

签发证书

letsencrypt 签发证书有多种模式,最常用的 webroot 模式不可用,因为需要将域名 A 记录解析到服务器 ip,而七牛融合 CDN 需要设置 cname 记录,俩者会有冲突,所以我采用了 DNS Api 模式,签发过程中会通过 DNSPod 的 Api 尝试创建 DNS 的 txt 记录来进行验证。

  • 先去获取 DNSPod 的 token:DNSPod:[201505] API 鉴权方式升级为 Token,记录下 ID 和 Token 备用。
  • 再使用 acme.sh 的命令:

    # DNSPod Token Id
    export DP_Id="1234"
    # DNSPod Token 值
    export DP_Key="sADDsdasdgdsf"
    acme.sh --issue --dns dns_dp -d example.com

    DP_Id 和 DP_Key会被保存下来,再次运行命令时就无需输入了。

将证书部署到七牛

  • 从七牛个人中心的密钥管理里获取 AK 和 SK,在融合 CDN 那里要确保已打开 HTTPS 功能,并且设置好域名的 CNAME 记录。

  • 将 AK 和 SK 导到环境变量:

    export QINIU_AK="foo"
    export QINIU_SK="bar"
  • 运行 acme.sh 命令部署到七牛:

    ➜  ~ acme.sh --deploy -d www.example.com --deploy-hook qiniu
    [Fri Jul 19 13:23:26 CST 2019] Certificate successfully uploaded, updating domain mifen.info
    [Fri Jul 19 13:23:27 CST 2019] Certificate successfully deployed
    [Fri Jul 19 13:23:27 CST 2019] Success

之后等待一段时间,等七牛配置生效就可以了。

定时执行

acme.sh 已经创建了定时任务,会定期更新证书:

10 0 * * * "/home/ubuntu/.acme.sh"/acme.sh --cron --home "/home/ubuntu/.acme.sh" > /dev/null

我又加了一条来自动部署到七牛(crontab -e):

0 0 1 * * "/home/ubuntu/.acme.sh"/acme.sh --deploy -d www.example.com --deploy-hook qiniu --home "/home/ubuntu/.acme.sh" > /dev/null

参考