本文首发地址 https://h89.cn/archives/532.html

背景

手上有台飞牛OS(fnOS)NAS,绑定了域名 f.h89.cn,HTTPS证书需要定期续期。手动更新太麻烦,写个脚本自动化处理。

环境说明

  • 系统:飞牛OS(本质是Linux,但服务管理有自己的套路)
  • 域名:f.h89.cn,DNS托管在阿里云
  • 证书工具:acme.sh
  • 涉及服务:
    • 飞牛OS自带Nginx(5667端口)
    • Docker容器:nginx、vaultwarden、gitea

证书存放位置

飞牛OS的证书放在这个目录:

/usr/trim/var/trim_connect/ssls/f.h89.cn/1766413711/
├── f.h89.cn.crt
└── f.h89.cn.key

Nginx配置里有个 trim_cert_cfg_path 指向 /usr/trim/etc/network_gateway_cert.conf,这个json文件记录了证书路径映射关系。所以只要把新证书替换到对应目录,再重启服务就行。

踩坑点:直接 nginx -s reload 没用,证书是由 network_service 管理的,得重启这个服务。

完整脚本

#!/bin/bash

export Ali_Key="你的AccessKey"
export Ali_Secret="你的Secret"

ACME_DIR=/vol1/1000/Tools/acme
LOG_PATH=$ACME_DIR/$(date '+%Y%m%d_%H%M%S').log
CERT_DEST="/usr/trim/var/trim_connect/ssls/f.h89.cn/1766413711"

cd ${ACME_DIR}/acme.sh

# 申请证书
./acme.sh --issue --dns dns_ali -d f.h89.cn --server letsencrypt >> $LOG_PATH

# 备份
cp -rfv ~/.acme.sh/f.h89.cn ${ACME_DIR} >> $LOG_PATH

# 替换证书
sudo cp -fv ~/.acme.sh/f.h89.cn/f.h89.cn.cer ${CERT_DEST}/f.h89.cn.crt >> $LOG_PATH
sudo cp -fv ~/.acme.sh/f.h89.cn/f.h89.cn.key ${CERT_DEST}/f.h89.cn.key >> $LOG_PATH

# 重启飞牛OS服务
sudo systemctl restart network_service >> $LOG_PATH 2>&1
sudo systemctl restart trim_nginx >> $LOG_PATH 2>&1

# 重启Docker容器
docker restart docker-nginx vaultwarden-server gitea >> $LOG_PATH 2>&1

sudo免密配置

脚本里用了sudo,需要先配置免密,否则执行时会卡在密码输入:

echo 'chenjim ALL=(ALL) NOPASSWD: /usr/bin/cp, /usr/trim/nginx/sbin/nginx, /usr/bin/systemctl' | sudo tee /etc/sudoers.d/chenjim-acme
sudo chmod 440 /etc/sudoers.d/chenjim-acme

定时任务

crontab -e

添加每月1号凌晨3点执行:

0 3 1 * * /vol1/1000/Tools/acme/start.sh

验证

手动跑一次,检查证书有效期:

echo | openssl s_client -connect 127.0.0.1:5667 -servername f.h89.cn 2>/dev/null | openssl x509 -noout -dates

输出应该是新证书的日期。


本文链接:飞牛OS自动更新SSL证书方案 - https://h89.cn/archives/532.html

版权声明:原创文章 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文链接和本声明。

标签: 飞牛, FN, 自动更新, SSL证书

添加新评论