当将公钥设置为身份时,KeePassXC 和 `.ssh/config` 行为不正确

当将公钥设置为身份时,KeePassXC 和 `.ssh/config` 行为不正确

我已经使用 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 一起使用,但需要手动配置。

相关内容