我已经使用 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
。有什么办法可以解决这个问题吗?
答案1
这里与 ssh -T 的唯一区别似乎是,末尾没有使用显式代理,而是只使用显式。有什么办法可以解决这个问题吗?
这意味着它与 KeePassX 模拟的 SSH 代理没有任何连接 —— 而且没有连接,它就无法仅使用公钥做任何有用的事情。
问题是存在OpenSSH 与 Windows 的几个不兼容端口– 尽管它们使用基本相同的代理协议,但它们在不同的传输上使用它,因为 Windows 花了 20 多年的时间才在 2016 年获得与 Unix 兼容的“本地套接字”功能。(当然,Windows NT 家族有“命名管道”可以完成这项工作,但是......其中一些移植决定可以追溯到 Windows 98,当时没有比 TCP 更好的东西,而且它还是全新的。)
因此,当你在 Windows 10 或更高版本上安装 Git 时,你总会得到其中两个:
您从常规命令 shell 运行的
ssh
是 Microsoft 完成的本机端口,与 Windows 10 一起安装,它通过 NT 命名管道连接到其 ssh 代理\\.\pipe\openssh-ssh-agent
。(微软做出的一个不寻常的选择是,只有一ssh-agent 适用于所有用户,作为系统服务运行,因此它无需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 一起使用,但需要手动配置。