我使用 KeePassXC 作为密码管理器已经有一段时间了,我对它非常满意。今天我决定尝试将其设置为ssh agent
. 我感兴趣的平台是 Windows 和 Linux。我按照超级用户的这篇文章,将我的 ssh 密钥添加到 KeePassXC。正如所宣传的,如果数据库解锁并且我运行,ssh-add -l
我会看到来自 KeePassXC 的密钥,而当数据库锁定时,我看不到密钥。
现在的问题是正确设置值~/.ssh/config
。我想避免代理只尝试所有可用的 ssh 密钥。所以我将以下两行添加到我的顶部~/.ssh/config
IdentitiesOnly yes
PasswordAuthentication no
正如另一篇超级用户帖子中所述,我将公钥添加到~/.ssh/config
Host bitbucket
HostName bitbucket.mycompany.com
User Sito
IdentityFile C:\Users\Sito\.ssh\bitbucket.pub
另一篇文章则声称
ssh
如果将 KeePassXC 添加到代理,将使用正确的密钥。
所以我跑了
> ssh -vvv -T [email protected]
...
debug1: Offering public key: C:\\Users\\Sito\\.ssh\\bitbucket.pub RSA HASH explicit agent
...
debug1: Server accepts key: C:\\Users\\Sito\\.ssh\\bitbucket.pub RSA HASH explicit agent
...
Authenticated to bitbucket.mycompany.com ([IP]:PORT)
...
shell request failed on channel 0
但是当我尝试从git clone
我们的服务器获取存储库时,我收到以下错误
> git clone ssh://git@link_to_repo
Load key "C:\\Users\\Sito\\.ssh\\bitbucket.pub": invalid format
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
我再次尝试对此进行调试,git config --global core.sshCommand='ssh-vvv'
但消息之前的最后一部分invalid format
只是
...
debug1: Server accepts key: C:\\Users\\Sito\\.ssh\\bitbucket.pub RSA HASH explicit
debug3: sign_and_send_pubkey: using publickey with RSA HASH
debug3: sign_and_send_pubkey: signing using rsa-sha2-512 HASH
Load key "C:\\Users\\Sito\\.ssh\\bitbucket.pub": invalid format
...
与这里唯一的区别ssh -T
似乎是它不是explicit agent
在最后只是说explicit
。有想法该怎么解决这个吗?
这意味着它与 KeePassX 模拟的 SSH 代理没有连接,如果没有连接,它就无法仅使用公钥做任何有用的事情。
问题是OpenSSH 与 Windows 之间存在多个不兼容的端口- 尽管它们使用基本相同的代理协议,但它们在不同的传输上使用它,因为 Windows 花了 20 多年才获得与 Unix 兼容的“本地套接字”功能(当然,Windows NT 系列有“命名管道”来完成这项工作,但是......其中一些移植决策可以追溯到 Windows 98,它没有比 TCP 更好的东西,即使那仍然是全新的。 )
因此,当您在 Windows 10 或更高版本上安装 Git 时,您总是会得到其中两个:
您
ssh
从常规命令 shell 运行的是 Microsoft 完成的本机端口,并与 Windows 10 一起安装,它通过 NT 命名管道连接到其 ssh 代理\\.\pipe\openssh-ssh-agent
。(微软做出的一个不寻常的选择是,所有用户只有一个ssh 代理,作为系统服务运行,因此它无需SSH_AUTH_SOCK
环境变量即可工作。)Git使用
ssh
的是与 Git 一起安装的基于 MSYS 的端口,它似乎使用传统的 Cygwin 方法在 TCP 套接字之上模拟 Unix 本地套接字。它需要一个SSH_AUTH_SOCK=/tmp/ssh-whatever
与 Linux 上一样的环境变量,并且它希望指向一个 Unix 风格的套接字路径,Cygwin 运行时将其转换为到 的 TCP 连接localhost:XYZ
。这两个程序只是碰巧就路径
~/.ssh
转换达成一致,因此它们都能够找到相同的 ~/.ssh/config (这已经比基于 Cygwin 的 OpenSSH 进步了一步,这是另一个曾经流行的端口过去 – 有一个完全独立的主目录),但它们完全无法与彼此的 ssh-agent 实例通信。KeePassX可以为两种 ssh-agent 协议提供支持(我相信已经有各个方向的桥梁,就像 Git 本身带有一个通往 PuTTY 的“Pageant”代理的桥梁,它以另一种不兼容的方式做同样的事情),但我不知道它是否真的可以做到这一点。
因此,我建议使用更简单的选项,强制 Git 使用 Windows 捆绑的 OpenSSH 变体,例如,通过指定 的完整路径
C:\Windows\System32\OpenSSH\ssh.exe
,或者直接删除 Git 捆绑的 OpenSSH(它自己的ssh.exe
位于C:\Program Files\Git
)。重新安装 Git 时,现在您可以选择使用 Windows OpenSSH 端口并跳过捆绑的端口:
在此之前,您可以选择使用捆绑的 OpenSSH 与 PuTTY
plink.exe
,后者同样拥有自己的代理 (Pageant),且协议完全不兼容。现在 Pageant 可以与 OpenSSH 一起使用,但需要手动配置。