本文将实现fnOS配置SSL证书实现https访问并且使用1Panel实现证书自动续签功能

fnOS新建文件夹用以证书存储

点击【文件管理】在你喜欢的磁盘中创建一个文件夹用以存储证书,比如我创建【certs】文件夹在【存储空间2】中

到这一步就先ok了,后面会用到这个文件夹,为了你可以直接看到你的证书

安装1Panel

安装1Panel实现证书申请以及自动续签

安装

应用中心中选择【1Panel】,点击安装

等待下载完成,根据需求配置

这里注意要记住你设置的安全入口名以及用户名/密码,比如我入口设置的是【safe】

点击确定即可

1Panel配置

登录

安装完成后,点击打开Panel

因为开启了安全入口,所以无法访问

在浏览器地址后面添加上安全入口路径即可,比如我的是 http://192.168.2.3:18090/safe

输入用户名密码登录

检查权限

在1Panel中,选择【主机】-【终端】

第一次连接需要手动配置,主机地址就默认就好,输入你fnOS的用户名以及密码,记得是fnOS的,不是1Panel的

点击右下角【连接测试】,然后通过后点击【保存并连接】

可以看到登录成功

回到fnOS中,右键第一步创建的certs文件夹,选择【详细信息】

点击【复制原始路径】

回到1Panel的终端,输入cd+空格+你复制的路径,如下所示

cd /vol2/1000/certs
​

尝试创建一个文件检查是否可以创建成功

touch 12
​

没问题,ok了~

SSL证书申请

选择【网站】-【证书】

添加Acme账户

点击【Acme账户】

创建

邮箱填一个,确认即可

添加DNS账户

点击【DNS账户】

创建,选择你的域名服务商,并且填入你的id和key,我这边以阿里云的为例,至于怎么获取这个id和key麻烦大家百度下

申请证书

点击【申请证书】

输入你要申请的证书域名

勾选【推送证书到本地目录】,并且选择刚刚创建的certs文件夹

勾选【申请证书之后执行脚本】,输入下面的脚本,注意这里要把 xxx.com.crtxxx.com.key中的【xxx.com】换成你自己的域名

#!/bin/bash
mv fullchain.pem xxx.com.crt
mv privkey.pem xxx.com.key
​

目的就是把生成的证书重命名下

点击确定,等待申请

关闭窗口,刷新下,如果显示正常,就是成功了

回到fnOS中,可以看到证书已经生成了

SSL证书配置

下载刚刚生成的两个证书

在【系统设置】-【安全性】-【证书】中选择【新增证书】

输入描述并且上传刚刚下载的证书文件

可以看到添加成功并且证书有效

访问测试,可以看到ssl生效。

ps: 因为我关闭了80、443强制跳转以及强制https所以需要完整的地址访问,也就是要包含 https://头和 端口号

自动续签SSL并更新证书

回到1Panel,之前在配置证书申请的时候已经勾选了自动续签,所以不用特殊操作续签动作

修改SSL证书申请脚本

依然是在1Panel的终端,输入

cat /usr/trim/etc/network_cert_all.conf
​

可以看到证书路径

我们复制到crt文件的前一级目录,比如

/usr/trim/var/trim_connect/ssls/xxx.com/1740193347
​

点击【网站】-【证书】选择你的证书选择【编辑】

将【申请证书之后执行脚本】修改为如下配置,并且将其中的配置项配置完整

注意要配置【CERT_NAME】【PANEL_CERT_PATH】【FNOS_CERT_PATH】字段

完整文件如下

#!/bin/bash

#配置
CERT_NAME="xxx.com"
PANEL_CERT_PATH="/vol2/1000/certs"
FNOS_CERT_PATH="/usr/trim/var/trim_connect/ssls/xxx.com/1740193347"

# 重命名
mv "$PANEL_CERT_PATH/fullchain.pem" "$PANEL_CERT_PATH/$CERT_NAME.crt"
mv "$PANEL_CERT_PATH/privkey.pem" "$PANEL_CERT_PATH/$CERT_NAME.key"

# 将新证书文件复制到旧证书文件的路径
cp "$PANEL_CERT_PATH/$CERT_NAME.*" "$FNOS_CERT_PATH/" -av

# 设置新证书文件权限为 755
chmod 0755 "$FNOS_CERT_PATH/*"

# 获取新证书的到期日期并更新数据库中的证书有效期
NEW_EXPIRY_DATE=$(openssl x509 -enddate -noout -in "$FNOS_CERT_PATH/$CERT_NAME.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='$CERT_NAME'"

# 重启服务
systemctl restart webdav.service
systemctl restart smbftpd.service
systemctl restart trim_nginx.service

​

至此就ok了~