如果不是使用 CloudFlare DNS,需要自己配置 acme-dns

注意,对应的网站需要在宝塔后台开启强制 SSL,这样宝塔才会在 Nginx 配置文件里设置对应的内容

acme.sh

首先安装 acme.sh

HiCA - 安装 ACME.sh

https://www1.hi.cn/docs/getting-started/acme.sh-installation/
curl https://get.acme.sh -s | sh -s

完成后通过 acme.sh --version 确认:

# acme.sh --version
https://github.com/acmesh-official/acme.sh
v3.0.5

开启自动更新:

acme.sh  --upgrade  --auto-upgrade

申请 Google Public CA 权限

参照:kn007的个人博客 - 使用acme.sh和acme-dns申请Google免费泛域名SSL证书

https://kn007.net/topics/using-acme-sh-and-acme-dns-get-googles-free-wildcard-ssl-certificate/存档

获得 b64MacKeykeyId

准备 CloudFlare DNS API

参照:烧饼博客 - 使用 acme.sh 配置自动续签 SSL 证书 > 「使用 DNS 验证签发证书」

https://u.sb/acme-sh-ssl/#%E4%BD%BF%E7%94%A8-dns-%E9%AA%8C%E8%AF%81%E7%AD%BE%E5%8F%91%E8%AF%81%E4%B9%A6存档

编写脚本

更新网站证书

当申请证书完毕/更新后,会自动执行下面的脚本,请保存到 /path/to/GoogleCA_ACME.sh 文件中(/path/to/ 自己定义,同步修改后面「配置 acme.sh」脚本的 --reloadcmd

保存后记得 chmod +x GoogleCA_ACME.sh

tld_domain 填写要申请的顶级域名。

当你宝塔后台的域名也是这个顶级域名时,可以把 forBtPanel 设置为 1,这样脚本会同步替换掉面板的 SSL 文件

#!/bin/bash
#-*- coding:utf-8 -*-

# 自行修改
tld_domain=""
forBtPanel=1

cd /www/wwwroot

# 获取此域名顶级域名和二级域名列表
count=0
declare -a array
for i in `ls`;do
    if [[ ${i} =~ ${tld_domain} ]]
    then
        array[${count}]=${i}
        count=$(expr ${count} + 1)
    fi
done

# 复制到对应域名目录
for j in ${array[*]}
do
    # 备份
    cp -rf /www/server/panel/vhost/cert/${j}/privkey.pem /www/server/panel/vhost/cert/${j}/privkey.pem.bak
    cp -rf /www/server/panel/vhost/cert/${j}/fullchain.pem /www/server/panel/vhost/cert/${j}/fullchain.pem.bak

    # 替换
    cp -rf /root/.acme.sh/${tld_domain}/server.rsa.key /www/server/panel/vhost/cert/${j}/privkey.pem
    cp -rf /root/.acme.sh/${tld_domain}/bundle.rsa.crt /www/server/panel/vhost/cert/${j}/fullchain.pem
done

/etc/init.d/nginx restart

# 如果面板也要替换的话
if [[ $forBtPanel -eq 1 ]]
then
    # 备份
    cp -rf /www/server/panel/ssl/privateKey.pem /www/server/panel/ssl/privateKey.pem.bak
    cp -rf /www/server/panel/ssl/certificate.pem /www/server/panel/ssl/certificate.pem.bak

    # 替换
    cp -rf /root/.acme.sh/${tld_domain}/server.rsa.key /www/server/panel/ssl/privateKey.pem
    cp -rf /root/.acme.sh/${tld_domain}/bundle.rsa.crt /www/server/panel/ssl/certificate.pem

    #重载面板
    bt reload
fi

如果你在宝塔后台新建了一个网站(也是此顶级域名),可以手动执行这个脚本重新替换一次 SSL

配置 acme.sh

随便新建个 sh 文件执行就行,这个只需要执行一次,记得根据上面脚本的路径同步修改底下 --reloadcmd

#!/bin/bash
#-*- coding:utf-8 -*-

email="你的 Google Cloud Platform 邮箱"
b64MacKey=""
keyId=""
tld_domain=""
CF_Token=""
CF_Account_ID=""
CF_Zone_ID=""

if [ ! -d "/root/.acme.sh/${tld_domain}" ]; then
  mkdir /root/.acme.sh/${tld_domain}
fi

export CF_Token=${CF_Token}
export CF_Account_ID=${CF_Account_ID}
export CF_Zone_ID=${CF_Zone_ID}

#申请证书
/root/.acme.sh/acme.sh --set-default-ca --server google
/root/.acme.sh/acme.sh --register-account --server google -m ${email} --eab-hmac-key ${b64MacKey} --eab-kid ${keyId}

/root/.acme.sh/acme.sh --issue --dns dns_cf -d '*.'${tld_domain} -d ${tld_domain} \
--cert-file /root/.acme.sh/${tld_domain}/server.rsa.crt \
--key-file /root/.acme.sh/${tld_domain}/server.rsa.key \
--fullchain-file /root/.acme.sh/${tld_domain}/bundle.rsa.crt \
--ca-file /root/.acme.sh/${tld_domain}/issuer.rsa.crt \
--reloadcmd "/path/to/GoogleCA_acme.sh"