背景
最近 apifox 的安全事件,让我想用密码管理器管理 ssh 密钥了。
以前也考虑过一次,但由于 bitwarden 不支持,就作罢了。
现在发现 bitwarden 在 2025 年已经支持了 ssh 密钥。
使用
导入密钥
具体可参见 Bitwarden SSH Agent | Bitwarden
这里说说我遇到的情况:
- 似乎无法导入自己现有的密钥,只能生成
这个解决方案是:先新建,让它随机生成一个,然后再打开这个条目重新编辑,就能在私钥右边看到一个从剪贴板导入,复制你的密钥即可
- 某些 rsa 的私钥似乎不支持,无法导入
这是因为旧版 OpenSSH 和大多数 TLS 库(例如 OpenSSH)使用的标准 PEM 格式,经典的 id_rsa 文件通常采用这种格式 。它是一个 ASN.1 编码结构,采用 base64 编码,并放置在 PEM 头部之间。
我们可以先备份,然后使用下面的命令进行转换
| |
转换后放到 windows 主机,使用时(比如测试 ssh -p 443 -T [email protected])可能会报错
| |
这个错误大概率是换行格式不对,需要将 CRLF 转换成 LF
如果你是在 git bash 中生成,或者是直接从 linux 下载文件到本地,大概率没问题。
如果你是在 windows 上创建文件然后拷贝进去,大概率存在问题
拷贝进去默认是这样

我们需要执行 dos2unix.exe ~/.ssh/id_rsa 来进行转换
转换后会是这个样子

注意,这些行尾都必须存在,格式必须一致,不然就会报错 Load key ...: error in libcrypto
转换后,这个 id_rsa 就可以导入 bitwarden 了
启动 ssh agent
打开 bitwarden desktop 客户端
打开设置 -> 启用 ssh 代理
Windows 上的使用
此时你直接在 windows 终端中执行 ssh-add -l 应该能看到了。
mobaxterm
20260402 更新:看了下最新版的 mobaxterm,已经内置支持 windows ssh agent,不再需要 winssh-pageant 了。
但是对于 mobaxterm 这种使用 putty pageant 协议的,使用不了
此处使用 mobaxterm 举例
[Windows] + [R],打开 services.msc
从服务列表中停止 OpenSSH Authentication Agent ,然后将其禁用
然后去 ndbeals/winssh-pageant: Bridge to Windows OpenSSH agent from Pageant. This means the openssh agent has the keys and this proxies pageant requests to it. 下载 winssh-pageant
然后双击运行,打开任务管理器,你应该能看到这个程序正在运行

然后再在 mobaxterm 本地终端中执行 ssh-add -l 应该能看到了
Git
如果此时你使用 git for windows,你可能会得到 Could not open a connection to your authentication agent. 的错误
这是因为 git for windows 有自己的一套 msys 环境。简而言之:
你可以执行 git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe" 来强制 git ssh 使用 windows 自带的 ssh 即可。
如果你想使用 git bash,在其中正常使用 ssh 等命令,你需要在 git bash 中编辑 .bashrc,补充如下内容
| |
来自 How do i set up Bitwarden ssh-agent within git-bash? : r/Bitwarden
MacOS 的使用
这部分来自官方文档 Bitwarden SSH Agent | Bitwarden
如果从 App Store 安装
| |
如果从 dmg 文件安装
| |
Linux 的使用
这部分来自官方文档 Bitwarden SSH Agent | Bitwarden
如果使用常规方法(deb/rpm/AppImage)安装
| |
如果您通过 Snap 或 Flatpak 安装
| |
根据您的环境,将上面的内容添加到您的 ~/.zshrc 或 ~/.bashrc 文件中
高级用法
代理转发
以下内容来自 Sign Git commits with SSH | 1Password Developer
启用远程主机的代理转发后,远程主机上的 SSH_AUTH_SOCK 环境变量会自动设置,您在远程环境中发出的每个 SSH 请求都会被转发到本地的 ssh-agent
如果要为某个主机启用代理转发,可以在 ssh 带上 -A 参数
| |
要检查是否正常工作,可以在远程主机上执行 ssh-add -l 查看转发到远程主机的 SSH 密钥列表。
比如你本地有 github 的 ssh key,那么你可以在远程主机上执行 ssh -T [email protected] 来测试
如果你想落地成配置,按照如下样例对本地的 ~/.ssh/config 进行配置
| |
问题
1. Too many authentication failures
这种情况发生在你在 bitwarden 里面添加了太多 ssh key,ssh 会挨个尝试,一般服务器定的尝试最大次数是 6,导致尝试次数超限
解决方案有如下几个方案(参考 Advanced use cases | 1Password Developer):
编辑对应服务器的
/etc/ssh/sshd_config,设置 MaxAuthTries 来增加此限制,但在许多情况下,无法(或不想)更改此设置。您可以改为指定哪个主机应与哪个 SSH 密钥匹配。为避免出现
Too many authentication failures 错误,您的 SSH 客户端需要知道哪个 SSH 公钥应该与哪个主机一起使用。这可以通过在 SSH 配置文件中设置Host 块中的IdentityFile来配置,其值应为您希望与该主机一起使用的公钥。复制 bitwarden 私钥所对应的公钥,然后写入
~/.ssh/xxx.pub文件在你的
~/.ssh/config 文件中,添加一个条目,指向你要连接的主机,并将IdentityFile设置为刚才创建的公钥路径
经过测试,IdentitiesOnly 配置项非必需1 2 3Host github.com IdentityFile ~/.ssh/xxx.pub IdentitiesOnly yes现在,您的 SSH 客户端将知道在连接到 SSH 服务器时要使用哪个密钥,因此将不会遇到这些身份验证限制
注意:某些 SSH 客户端不支持在
IdentityFile 中指定公钥。请参阅 SSH 客户端兼容性
2. 同一台服务器使用不同的身份
没有使用 ssh-agent 之前,你可能使用如下的手段来定义不同的 ssh 别名,以使用不同的身份登录远端 ssh
| |
然后使用 ssh user1server 这种命令来以不同的身份登录服务器
现在要使用 ssh-agent,你只需要将 IdentityFile 按照上面的方式改为 pub key 即可。
例如在同一台机器上使用多个 Git 身份(来自 Advanced use cases | 1Password Developer)
| |
对于每个 Git 存储库,将 git URL 更改为使用新的 SSH 主机别名之一,而不是默认主机 URL
| |
例如
| |
这样 SSH 客户端将知道每个 Git 身份应该使用哪个 SSH 密钥
3. 普通 ssh 也会报错 Too many authentication failures
这个和第 1 个问题同源。
我们可以在 ssh 时添加 IdentitiesOnly=yes 来规避这个问题
例如
| |
如果你是想对特定网段启用全部启用该配置,可以将如下内容添加到 ~/.ssh/config
| |
这个配置代表在 192.168.1.* 上启用 IdentitiesOnly=yes
但有个例外情况,就算你做了上述配置,在 mobaxterm 上还是会出现该问题,需要在 session 配置中,打开 Expert SSH settings,然后取消勾选,即可
不过 mobaxterm 有个 ssh tunnel 功能还是无解