由于笔者需要将飞牛FnOS挂到公网去访问,需要套个SSL证书增加一下安全性(其实是比较烦浏览器的不安全提示😅),最开始使用的是Lucky进行反代,后来飞牛APP提示不安全。
发现是由于飞牛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
(名字不重要可以随便起),写入以下内容:
#!/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
第一次运行会报错,因为这时候没有这个证书的文件夹路径。
打开ACME运行目录
ACME_DIR
,下载里面的xxx.crt
和xxx.key
,打开飞牛网页,上传证书。上传之后打开飞牛的
/usr/trim/var/trim_connect/ssls/
这时候里面就有以你域名命名的xxx
这个路径了。复制这个数字的路径,类似
/usr/trim/var/trim_connect/ssls/xxx/1741347821
,粘贴到update-certs.sh
的SSL_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
确认即可
评论区