<br />
<br />
飞牛os本身没有acme功能,需要手动添加证书,现在阿里和腾讯的免费证书全都是3个月到期,很麻烦,写个脚本让它自动更新证书

第一步
SSH连接到飞牛,在用户目录新建一个脚本文件update-certs.sh(名字随便起,自己找得到就行),内容如下
#!/bin/bash
set -e
# 定义变量
ACME_DIR="/home/NICHX/ACME"
DOMAIN="XXX.COM"
SSL_DIR="/usr/trim/var/trim_connect/ssls/${DOMAIN}/1741347821"
ALI_KEY="XXXXX"
ALI_SECRET="XXXXX"
# 运行 Docker 容器
docker run --rm -itd -v "${ACME_DIR}:/acme.sh" -e Ali_Key="${ALI_KEY}" -e Ali_Secret="${ALI_SECRET}" --net=host --entrypoint /bin/sh --name=acme.sh neilpang/acme.sh
# 设置默认 CA
docker exec acme.sh --set-default-ca --server letsencrypt
# 申请证书
docker exec acme.sh --issue --dns dns_ali -d "${DOMAIN}" --force
# 安装证书
docker exec acme.sh --install-cert -d "${DOMAIN}" --key-file "/acme.sh/privkey.pem" --fullchain-file "/acme.sh/fullchain.pem"
# 移动和设置文件权限
cd "${ACME_DIR}"
if [ -f "fullchain.pem" ]; then
mv fullchain.pem "${DOMAIN}.crt"
chmod 0755 "${DOMAIN}.crt"
else
echo "fullchain.pem 文件不存在,无法移动。" >&2
exit 1
fi
if [ -f "privkey.pem" ]; then
mv privkey.pem "${DOMAIN}.key"
chmod 0755 "${DOMAIN}.key"
else
echo "privkey.pem 文件不存在,无法移动。" >&2
exit 1
fi
# 创建软链接
if [ -f "${ACME_DIR}/${DOMAIN}.crt" ]; then
ln -sf "${ACME_DIR}/${DOMAIN}.crt" "${SSL_DIR}/${DOMAIN}.crt"
else
echo "${DOMAIN}.crt 文件不存在,无法创建软链接。" >&2
exit 1
fi
if [ -f "${ACME_DIR}/${DOMAIN}.key" ]; then
ln -sf "${ACME_DIR}/${DOMAIN}.key" "${SSL_DIR}/${DOMAIN}.key"
else
echo "${DOMAIN}.key 文件不存在,无法创建软链接。" >&2
exit 1
fi
# 获取新证书的到期日期并更新数据库中的证书有效期
if [ -f "${SSL_DIR}/${DOMAIN}.crt" ]; then
NEW_EXPIRY_DATE=$(openssl x509 -enddate -noout -in "${SSL_DIR}/${DOMAIN}.crt" | sed "s/^.*=\(.*\)$/\1/")
NEW_EXPIRY_TIMESTAMP=$(date -d "$NEW_EXPIRY_DATE" +%s%3N) # 获取毫秒级时间戳
# 更新数据库中的证书有效期
psql -U postgres -d trim_connect -c "UPDATE cert SET valid_to = '$NEW_EXPIRY_TIMESTAMP' WHERE domain = '${DOMAIN}'"
if [ $? -eq 0 ]; then
echo "数据库更新成功"
else
echo "数据库更新失败" >&2
exit 1
fi
else
echo "证书文件 ${SSL_DIR}/${DOMAIN}.crt 不存在,无法获取到期日期。" >&2
exit 1
fi
# 停止 Docker 容器
docker stop acme.sh
# 重启服务
sudo systemctl restart webdav.service
sudo systemctl restart smbftpd.service
sudo systemctl restart trim_nginx.service
echo '证书替换完成'


文件中的变量改成你自己的对应的值
ACME_DIR="/home/XXX/ACME" #ACME运行目录
DOMAIN="xxx.com" #改成你自己的域名
SSL_DIR="/usr/trim/var/trim_connect/ssls/\${DOMAIN}/1741347821" #第一次运行时忽略,第二次运行时需修改,后文再说
ALI_KEY="XXXXXXX" #阿里云DNS KEY
ALI_SECRET="XXXXXXX" #阿里云DNS SECRET
第二步
然后使用root用户运行一次脚本,第一次运行会报错,因为这时候没有这个证书的文件夹路径
sudo bash update-certs.sh
打开ACME_DIR,下载里面的xxx.com.crt和xxx.com.key,打开飞牛网页,上传证书

上传之后打开飞牛的/usr/trim/var/trim_connect/ssls/ 这时候里面就有xxx.com这个路径了

复制这个数字的路径,类似‘/usr/trim/var/trim_connect/ssls/xxx.com/1741347821’,粘贴到update-certs.sh的SSL_DIR变量。
再运行一次脚本,这时候应该就成功了。
第三步
使脚本定时执行,ssh到飞牛,输入命令crontab -e
最后一行插入
0 0 1 * * /home/NICHX/update-certs.sh >> /home/NICHX/ACME/acmelog.log 2>&1
意思是每个月1号的0点执行一次脚本,并将日志输出到acmelog.log(这里没有写清理日志,时间久了可以手动删一下日志,如果不需要日志,就不要写>>及之后的内容)
然后Ctrl+X退出并保存,Y确认,Enter确认即可 |