Git pull 不要求输入密码

Git pull 不要求输入密码

我使用 ssh 密钥对各种远程 git 存储库进行身份验证。我在 Azure 上托管了项目 A,在 GitLab 上托管了项目 B。我的~/.ssh/config项目如下所示:

$ cat ~/.ssh/config
Host vs-ssh.visualstudio.com
      IdentityFile ~/.ssh/id_rsa_inveogit

Host gitlab.com
      IdentityFile ~/.ssh/id_rsa_gitlab

以及全球版本:

$ cat /etc/ssh/ssh_config
AddressFamily inet
AddKeysToAgent yes
PasswordAuthentication no

真的没什么特别的。

然后我转到我的项目 A 并从远程 Azure 服务器中提取:

$ cd A
$ git pull
Enter passphrase for key '/home/pavel/.ssh/id_rsa_inveogit':

系统要求我输入密码,添加正确的密码后,我就可以从服务器中提取数据。

然后我转到托管在 GitLab 上的项目 B 并执行相同的操作:

$ cd B
$ git pull
Enter passphrase for key '/home/pavel/.ssh/id_rsa_gitlab':

再次,它按预期工作,我可以从远程存储库中提取。

问题是,当我首先转到 B 并执行 git-pull,然后转到 A 并执行 git-pull 时。在 A 中,我不再被要求输入密码,但它的结尾如下:

$ git pull
remote: Public key authentication failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights and the repository exists.

为什么没有要求我输入密码?

我的密码也被 ssh-agent 缓存了,所以我可以看到$ ssh-add -l,当我在第一个成功的示例(首先是 A,然后是 B)之后检查时,我可以看到两个 ssh 密钥被缓存了。

看起来我的~/.ssh/config是正确的,因为当我第一次进入项目 A 然后进入 B 时,主机模式匹配正确,如第一个示例所示。但是,我尝试将其更改为:

Host vs-ssh.visualstudio.com !gitlab.com
      IdentityFile ~/.ssh/id_rsa_inveogit

Host gitlab.com !vs-ssh.visualstudio.com
      IdentityFile ~/.ssh/id_rsa_gitlab

但这并没有任何效果。

我尝试运行$ git pull -v,但这仅适用于获取和合并,而不适用于如何处理键,所以我无法在那里获得更多信息。

两个密钥的生成方式与 类似$ ssh-keygen -t rsa -b 4096 -C "my-email-addr",我尝试为 Azure 和 GitLab 生成一个新密钥,但也没有结果。

我当然可以关闭 ssh-agent,然后系统会要求我输入密码。但我不认为这是一个解决方案,因为它以后不会被缓存。

我不知道如何进一步调试。如果您能为我提供解决方案,我将不胜感激。

谢谢。

编辑

根据建议,我开始使用和进行调试。$ ssh -T -vvv [email protected]$ ssh -T -vvv [email protected]

我看到 Azure 在情况 B => A 中的情况如上所述(不起作用的情况):

debug1: Will attempt key: pavel@base RSA SHA256:dJVdF1nrymxvQqii08O7wxD0++PbAhCgn99y7pEam+c agent
debug1: Will attempt key: /home/pavel/.ssh/id_rsa_inveogit RSA
SHA256:2594KhHLozR4kGAM12h1FKgbS9xPhVi2PNcvaaPi6B8 explicit
debug2: pubkey_prepare: done
debug3: send packet: type 5
debug3: receive packet: type 6
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug3: send packet: type 50
debug3: receive packet: type 51
debug1: Authentications that can continue: password,publickey
debug3: start over, passed a different list password,publickey
debug3: preferred publickey,keyboard-interactive
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering public key: pavel@base RSA SHA256:dJVdF1nrymxvQqii08O7wxD0++PbAhCgn99y7pEam+c agent
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 60
debug1: Server accepts key: pavel@base RSA SHA256:dJVdF1nrymxvQqii08O7wxD0++PbAhCgn99y7pEam+c agent
debug3: sign_and_send_pubkey: RSA
SHA256:dJVdF1nrymxvQqii08O7wxD0++PbAhCgn99y7pEam+c
debug3: sign_and_send_pubkey: signing using ssh-rsa SHA256:dJVdF1nrymxvQqii08O7wxD0++PbAhCgn99y7pEam+c
debug3: send packet: type 50
debug3: receive packet: type 52
debug1: Authentication succeeded (publickey).
Authenticated to vs-ssh.visualstudio.com ([40.74.28.1]:22).

第一个尝试的密钥是存储在 ssh-agent 中的 GitLab 密钥。它首先尝试该密钥,然后服务器回复我已通过身份验证。因此,显然它永远不会尝试另一个密钥,而这实际上是 Azure 的正确密钥。

实际工作情况如上所述:

debug1: Will attempt key: pavel@base RSA
SHA256:2594KhHLozR4kGAM12h1FKgbS9xPhVi2PNcvaaPi6B8 agent
debug1: Will attempt key: /home/pavel/.ssh/id_rsa_gitlab RSA SHA256:dJVdF1nrymxvQqii08O7wxD0++PbAhCgn99y7pEam+c explicit
debug2: pubkey_prepare: done
debug3: send packet: type 5
debug3: receive packet: type 7
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: 
server-sig-algs=<ssh-ed25519,ssh-rsa,rsa-sha2-256,rsa-sha2-512,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521>
debug3: receive packet: type 6
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug3: send packet: type 50
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,keyboard-interactive
debug3: start over, passed a different list publickey,keyboard-interactive
debug3: preferred publickey,keyboard-interactive
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering public key: pavel@base RSA
SHA256:2594KhHLozR4kGAM12h1FKgbS9xPhVi2PNcvaaPi6B8 agent
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,keyboard-interactive
debug1: Offering public key: /home/pavel/.ssh/id_rsa_gitlab RSA SHA256:dJVdF1nrymxvQqii08O7wxD0++PbAhCgn99y7pEam+c explicit
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 60
debug1: Server accepts key: /home/pavel/.ssh/id_rsa_gitlab RSA SHA256:dJVdF1nrymxvQqii08O7wxD0++PbAhCgn99y7pEam+c explicit
debug3: sign_and_send_pubkey: RSA
SHA256:dJVdF1nrymxvQqii08O7wxD0++PbAhCgn99y7pEam+c
debug3: sign_and_send_pubkey: signing using rsa-sha2-512 SHA256:dJVdF1nrymxvQqii08O7wxD0++PbAhCgn99y7pEam+c
Enter passphrase for key '/home/pavel/.ssh/id_rsa_gitlab':
debug1: identity added to agent: /home/pavel/.ssh/id_rsa_gitlab
debug3: send packet: type 50
debug3: receive packet: type 52
debug1: Authentication succeeded (publickey).
Authenticated to gitlab.com ([172.65.251.78]:22).

Azure 密钥在这里无法按预期工作,因此系统要求我输入密码,只有在提供正确的密码后,我才能通过身份验证。

这让我不禁要问:当我提供了错误的密钥时,Azure 为什么会对我进行身份验证?

答案1

最后我会回答我自己的问题。

我发现有关使用 ssh 密钥连接的 MS 文档中写道:

问:我有多个 SSH 密钥。如何为不同的 SSH 服务器或存储库使用不同的 SSH 密钥?

答:通常,如果您为 SSH 客户端配置多个密钥并连接到 SSH 服务器,则客户端可以一次尝试一个密钥,直到服务器接受一个密钥。

但是,由于与 SSH 协议以及我们的 Git SSH URL 结构相关的技术原因,这不适用于 Azure DevOps。Azure DevOps 将盲目接受客户端在身份验证期间提供的第一个密钥。如果该密钥对于请求的存储库无效,则请求将失败并出现以下错误:

remote: Public key authentication failed.
fatal: Could not read from remote repository.

这也适用于我的情况。他们还在 中给出了不同 Host 指令的示例~/.ssh/config,我就是这么做的。但他们忘记了人们可能还会使用 ssh-agents 来缓存密钥,这基本上使得使用 Host 指令的解决方案在像我这样的情况下毫无用处。

我没有做错什么,但这是 Azure DevOps 的一个限制。对我来说,这很不幸,因为这基本上意味着我无法在使用 Azure DevOps 存储库之前缓存其他 ssh 密钥。

相关内容