因为我的电脑和服务器都很多,管理多台设备的 SSH 配置一直是个痛点。

以前的做法是手动复制私钥,然后还得维护一份差异巨大的 ~/.ssh/config,不安全又麻烦。

最近我重构了整套方案,达成了以下效果:

  1. 零私钥落地:私钥只存在于 Bitwarden 内存,硬盘上无私钥文件。
  2. 配置云同步:公钥和 Config 通过 OneDrive 同步。
  3. 路径大一统:利用 Symlink 抹平 Windows 和 macOS 的路径差异。

需要提前启用 Bitwarden 的 SSH Agent 功能,参考官方文档:Bitwarden SSH Agent

目录结构策略

私钥交给 Bitwarden 托管,我们只需要同步公钥和通用配置。

在 OneDrive 中建立如下结构:

OneDrive/
└── .../
└── ssh/
├── common_config # 配置文件
└── ssh-keys/
└── github.pub # 只有公钥

抹平路径差异

这是最关键的一步。

SSH 配置文件不支持环境变量(如 %OneDrive%),且不同电脑的云同步路径各异(D 盘、C 盘、/Users/...)。

解决方案是在每台电脑的 ~/.ssh/ 下创建一个名为 cloud_ssh 的软链接,指向真实的云同步目录。

Windows

cd ~/.ssh
New-Item -ItemType Junction -Path "cloud_ssh" -Target "...\ssh"

macOS / Linux

cd ~/.ssh
ln -s ".../ssh" cloud_ssh

现在,无论在哪个系统,~/.ssh/cloud_ssh 都是通用的路径。

SSH Config 配置

在本地的 ~/.ssh/config 中,只需要一行 Include:

Include ~/.ssh/cloud_ssh/common_config

然后在 OneDrive 里的 common_config 编写配置:

# example
Host github.com
User git
IdentityFile ~/.ssh/cloud_ssh/ssh-keys/github.pub
IdentitiesOnly yes

这里 IdentityFile 指向的是 .pub 文件。在 SSH Agent 模式下,SSH 客户端会读取这个公钥的指纹,然后去 Bitwarden Agent 里请求对应的私钥。

疑难杂症

Windows Git 的坑

在 Windows 上配置好后,ssh -T [email protected] 通了,但 git clone 可能会报 error in libcryptoPermission denied

这是因为 Git for Windows 默认使用内置的 MinGW SSH,它找不到 Bitwarden 的 Agent,也不支持指向 .pub 的配置。

强制 Git 使用 Windows 原生 OpenSSH 即可。

git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"