侧边栏壁纸
博主头像
慕怀夕 博主等级

行动起来,活在当下

  • 累计撰写 11 篇文章
  • 累计创建 10 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

飞牛FnOS使用Acme自动续签更新证书

小Han同学
2025-04-05 / 0 评论 / 0 点赞 / 129 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

由于笔者需要将飞牛FnOS挂到公网去访问,需要套个SSL证书增加一下安全性(其实是比较烦浏览器的不安全提示😅),最开始使用的是Lucky进行反代,后来飞牛APP提示不安全。

67f0adefebb59.webp

发现是由于飞牛App登录连接时会要求升级了链接协议到WSS,需要进行Websocket的配置。

location /websocket {
proxy_pass http://127.0.0.1:port(你的端口号);
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}

但是发现Lucky并不基于Nginx,无法进行Websocket的配置。笔者能力有限也不会改,所以放弃了Lucky反代的方案。

部署ACME

内容参考自:https://club.fnnas.com/forum.php?mod=viewthread&tid=17785&highlight=

一、新建脚本文件

1.1 创建脚本

建一个脚本文件updatessl.sh(名字不重要可以随便起),写入以下内容:

<="" joe-message="">

#!/bin/bash
set -e

# 定义变量
ACME_DIR="/home/XXX/ACME"
DOMAIN="你的域名"
SSL_DIR="/usr/trim/var/trim_connect/ssls/${DOMAIN}/1741347821"
ALI_KEY="阿里的KEY"
ALI_SECRET="阿里的SECRET"

# 运行 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 '证书替换完成'

1.2 编辑脚本

你需要自定义编辑文件中定义变量的内容

ACME_DIR="/home/XXX/ACME" #ACME运行目录,XXX为你的用户名
DOMAIN="xxx" #改成你自己的域名
SSL_DIR="/usr/trim/var/trim_connect/ssls/${DOMAIN}/XXX" #第一次运行时忽略,第二次运行时需修改,后文再说
ALI_KEY="XXXXXXX" #阿里云DNS KEY
ALI_SECRET="XXXXXXX" #阿里云DNS SECRET

二、运行脚本

使用root用户运行一次脚本

sudo bash updatessl.sh
  1. 第一次运行会报错,因为这时候没有这个证书的文件夹路径。

  2. 打开ACME运行目录ACME_DIR,下载里面的xxx.crtxxx.key,打开飞牛网页,上传证书。

  3. 上传之后打开飞牛的/usr/trim/var/trim_connect/ssls/ 这时候里面就有以你域名命名的xxx这个路径了。

  4. 复制这个数字的路径,类似/usr/trim/var/trim_connect/ssls/xxx/1741347821,粘贴到update-certs.shSSL_DIR变量。

运行一次脚本,这时候应该就成功了。

三、添加定时任务

脚本运行成功后,使脚本定时执行,输入命令

crontab -e

在文件末尾最后一行插入以下命令,其中注意路径中XXX的位置替换为你自己的用户名

0 0 1 * * /home/XXX/updatessl.sh >> /home/XXX/ACME/acmelog.log 2>&1

意思是每个月1号的0点执行一次脚本,并将日志输出到acmelog.log(这里没有写清理日志,时间久了可以手动删一下日志,如果不需要日志,就不要写>>及之后的内容)

然后Ctrl+X退出并保存,按Y确认,Enter确认即可

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区