用 Sshfs 远程挂载其他服务器上的 Ssl 证书

温馨提醒
总结摘要
用 sshfs 远程挂载其他服务器上的 ssl 证书

前言

前段时间,在家里树莓派上搭建的家庭影音服务器 Jellyfin 的 SSL 安全证书到期了,三个月过得好快

我的 SSL 证书申请程序,安装在 A 机器上 但是 nginx 和 Jellyfin 安装在 B 机器上

每次证书更新,都需要手动复制证书文件,从 A 到 B 机器上 是不是有点太呆瓜了?

那就试试远程挂载的方式吧

SSHFS 是一个基于 SSH 协议的网络文件系统客户端,它允许用户通过 SSH 协议安全地挂载远程文件系统到本地机器上。这种挂载方式不仅保证了数据传输的安全性,而且操作起来也非常方便。SSHFS 使用 FUSE(Filesystem in Userspace)技术,使得非特权用户也能够在用户空间创建自己的文件系统而无需 root 权限。这使得 SSHFS 成为了一个在远程开发、文件同步等场景下非常实用的工具。

环境

机器都在同一个局域网,都能获取到 ipv6 的外网地址

  1. A 主机:root 用户,安装有 SSL 证书申请程序,每三个月更新证书
  2. B 主机:普通用户,安装有 Nginx 和 Jellyfin 影音程序

我需要做的是,让 B 主机挂载 A 主机上, SSL 证书申请程序,放置证书文件的目录,目录如下

1
/etc/ssl/acme/ssl_files

配置步骤

安装 sshfs

我的树莓派是 Debain 系统(Ubuntu 下面的命令通用),运行如下命令安装即可

1
2
sudo apt-get update 
sudo apt-get install sshfs

对于 CentOS/RHEL 系统:

1
sudo yum install fuse-sshfs

对于 Fedora 系统:

1
sudo dnf install fuse-sshfs

B 主机配置免密登录 A 主机

为了方便使用 SSHFS,建议配置 SSH 无密码登录到远程服务器。这一步会生成一个 SSH 密钥对,并将公钥复制到远程服务器的 ~/.ssh/authorized_keys 文件中。

1
2
3
4
5
# 生成SSH密钥对(如果尚未生成)
ssh-keygen -t rsa -b 4096

# 将公钥复制到远程服务器
ssh-copy-id -i ~/.ssh/id_rsq.pub user@remote_host

替换 userremote_host 为你的远程服务器的用户名和地址。完成这一步,就可以开始挂载 A 主机的证书目录了

B 主机运行挂载命令

在运行之前,还需要修改一下 /etc/fuse.conf 文件

这是因为,我的 B 主机挂载外置硬盘的用户是普通用户, 外置硬盘是 用普通用户挂载 的,我 不想改它的属主(owner)或权限,但又想 由 root 用 sshfs 挂载一个远程目录到外置硬盘下的一个子目录(/mnt/ExtendDisk/Configs/Jellyfin/key

1
sudo vim /etc/fuse.conf

将文件中的 user_allow_other 参数取消注释

1
2
3
4
5
oliverpi@raspberrypi:~ $ sudo vim /etc/fuse.conf
# The file /etc/fuse.conf allows for the following parameters: 
……skip……
user_allow_other 
……skip……

完成上面的 fuse 配置后,运行下面的命令

1
sshfs root@192.168.123.1:/etc/ssl/acme/ssl_file /mnt/ExtendDisk/Configs/Jellyfin/key/ -o IdentityFile=~/.ssh/id_rsa,allow_other

检查一下

1
df -hT

成功挂载

ok,A 主机的文件成功挂载到 B 主机的 /mnt/ExtendDisk/Configs/Jellyfin/key/ 目录下了

B 主机配置自动挂载

上面的命令在关机重启以后,就会失效,所以我们还需要配置一下 /etc/fstab

1
2
3
4
sudo vim /etc/fstab

# 在最后一行添加
sshfs#root@192.168.123.1:/etc/ssl/acme/ssl_file /mnt/ExtendDisk/Configs/Jellyfin/key fuse _netdev,IdentityFile=~/.ssh/id_rsa,allow_other,defaults 0 0

说明:

  • _netdev: 延迟挂载直到网络就绪;
  • allow_other: 让 Jellyfin 等非 root 服务有权访问;

ok,可以不用操心证书的过期问题了

参考

  1. Linux 挂载远程目录
  2. Linux 环境下实现远程文件夹挂载的 SSHFS 使用教程