Azure DevOps上的Git SSH公钥身份验证失败

61

我正在尝试从PowerShell将一个git存储库推送到Azure DevOps仓库,但每次尝试推送时都会收到不同的身份验证错误。

我希望能有人能够讲解一下该如何检查并进行适当的演示。

例如:

git remote add origin git@ssh.dev.azure.com:v3/MyAzure/MyProject/MyRepo
git push -u origin --all

我一直收到以下提示:

git@ssh.dev.azure.com的密码:

我已经输入了各种密码,但仍然无法成功。它在说哪个密码?

或者,我也收到过以下提示:

权限被拒绝,请重试。

致命错误:无法从远程存储库读取。

请确保您拥有正确的访问权限并且存储库存在。

验证:

$ ssh -T myemail@mycompany.com
ssh: connect to host mycompany.com  port 22: Connection refused

我已完成以下内容:
  • 在 Azure DevOps 中创建了一个仓库
  • 按照 Microsoft 文档使用 git-bash 创建了 SSH 密钥,将密钥复制并粘贴到 Azure DevOps 安全性中,且无空格。
  • 转到我的个人资料 / 安全性,并添加了一个在 git-bash 中生成的 SSH 密钥。
我是否漏掉了明显的步骤?使用个人访问令牌是否更好?能否提供正确步骤的详细说明?

1
请按照此步骤说明进行操作:https://learn.microsoft.com/zh-cn/azure/devops/repos/git/use-ssh-keys-to-authenticate?view=vsts - Jayendran
1
我已经做了,我需要重新做吗? - developer9969
1
@Jayendran 它要求我输入密钥 .ssh/id_rsa 的密码,我将其留空并按下回车键,然后它又要求我输入 git@ssh.dev.azure.com 的密码。 - developer9969
1
@Jayendran 我也遇到了同样的问题,我输入了我为我的ssh密钥设置的密码短语,但是然后我被要求输入 git@ssh.dev.azure.com 的密码。 - Schalton
1
这表明我们被提示输入密码是因为SSH验证失败了。 - Schalton
显示剩余3条评论
19个回答

100

在任何通配符条目之前,将以下行添加到~/.ssh/config中:

Host ssh.dev.azure.com
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes
  HostkeyAlgorithms +ssh-rsa
  PubkeyAcceptedKeyTypes=ssh-rsa

这个链接由@wcoder提供,对我很有帮助。此外,DevOps 仅允许使用已弃用的ssh-rsa密钥, 而新版本的OpenSSH现在会阻止它们。

最后,更加荒谬的是,如果你有一个通配符条目(Host *),你需要排除 DevOps 使用该条目中的任何密钥,因为DevOps 将盲目接受客户端提供的第一个密钥 ‍♂️:

Host * !ssh.dev.azure.com
    ...

1
谢谢!我在我的配置文件中的“Host”条目前忘记了“ssh”。你的解决方案很好用! - Jordan
你的配置文件是什么样子的?能否提供一个该文件应该包含内容的链接? - Judy007
2
这对我也起作用了,我在Github上有一个id_ed25519,并且在配置文件中有一个被视为通配符(*)的条目,显然这对于Azure不起作用。 - noppe
Windows上的路径:C:\Users\Your_User.ssh - Saibamen
这个答案对我有用。我在升级到 macOS Ventura 后遇到了这个问题,我猜想这可能是因为新版 OpenSSH 的缘故。我通过在~/.ssh/config中添加以下内容运行git fetch来诊断它:Host ssh.dev.azure.com LogLevel DEBUG3这显示出 debug2: we did not send a packet, disable method,这让我看到了一个 SF answer,然后又找到了这个答案。 - nftw

27
在此之前,我已经尝试了其他答案,但都没有成功。最后,在 Fedora 中,这篇文章 给了我解决方案。
使用 -v 开关运行 ssh (ssh -v -T git@ssh.dev.azure.com) 显示了这个错误:
debug1: send_pubkey_test: no mutual signature algorithm

解决方法是将以下一行添加到客户端配置文件(~/.ssh/config)中:

PubkeyAcceptedKeyTypes +rsa-sha2-256,rsa-sha2-512

这解决了SSH到RouterOS设备时的问题。我猜他们最近在更新中改变了一些东西,因为几个月前我没有遇到这个问题。 - pyansharp
除了上述解决方案之外,这个对我起作用了。 - amartin1911
看到为什么它不起作用的实际方法!看到了我的错误所在。 - Oylex

20

我相信@Schalton的评论是正确的:SSH验证失败,因此会提示输入密码。

我遇到过同样的问题。通过将密钥生成为默认值('id_rsa')而不是使用其他名称(尝试了其他名称但都不起作用),我“解决了”这个问题。

[####@#### .ssh]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/guille/.ssh/id_rsa): id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.

编辑: 如@LHM所指出的,括号中显示了保存密钥的文件的默认值(无需输入)。


我在/home/ubuntu/.ssh/ <<这里>> 有一个同名的id_rsa.pub文件,但仍然在shell中收到“git@ssh.dev.azure.com's password:”消息。有人能解释一下吗? - Ahmer Saeed
这真的帮了很多,伙计!刚刚解决了我的问题,生成了新的密钥。 - Mauro Vinicius

13

我知道这个问题提到了powershell。但是,由于标题和标签的原因,其他操作系统的人可能会来到这里,并且在mac和linux上访问Azure Devops存在一个常见问题。

为了解决这个问题,需要将IdentitiesOnly yes添加到~/.ssh/config文件中。

这是Azure Devops的一个常见问题。不幸的是,我不确定为什么这样做可以解决它。


3
没错,你是对的!DevOps问答 - Yauheni Pakala

12
TL;DR: 括号中显示的路径和文件名(例如:/home/guille/.ssh/id_rsa)是一个默认值,可以通过留空并按下Enter键来接受。
扩展回答:我也遇到了同样的问题。我犯了与@eltbus相同的错误(试图自己命名文件),所以他坚持使用默认值“id_rsa”对我很有帮助。我还意识到,当我生成rsa密钥对时,我将id_rsa.pub保存到了错误的文件夹中。(只输入id_rsa而没有前导文件路径,就可以将其保存到不同的文件夹中。)
如果您只是按下Enter键接受默认的文件名和位置,而不是键入路径和/或文件名,则可以避免上述两个错误。
示例:
[####@#### .ssh]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/guille/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.

1
留空文件名对我有用。即使您输入相同的文件名id_rsa,它仍然无法工作,因为它会将其保存在父文件夹中。 - Saj

4
我一开始使用了 GitHub 推荐的 Ed25519 算法密钥,但 Azure DevOps 不支持该算法,所以我生成了一个标准密钥。问题在于我忘记添加该密钥:
ssh-add -k ~/.ssh/id_rsa

如何在Windows中使用此命令?在Git Bash中,我遇到了错误“无法打开与您的身份验证代理的连接。” - Saibamen

3

我有相同的问题。

我的解决方案是:

当我尝试使用sudo git clone...时,路径没有访问我的公钥和私钥位置:\home\localuser\.ssh\...的权限。

为了解决这个问题,我将目标路径的所有权更改为相同的用户:组,即存储我的密钥,并避免使用sudo git clone....,现在我正在使用git clone而不是sudo,一切正常。

希望你能理解......


2
这真的是同一个问题吗?看了问题描述,我认为它与你试图解决的问题不同。你的问题是关于使用sudo进行克隆(这是一个坏主意)。实际问题似乎是关于正确设置SSH密钥。 - Stephen C

2

我发现我的仓库SSH URL与我的DevOps URL不同,在我的情况下,解决方法是在我的~/.ssh文件夹中添加配置文件,并使用以下信息:

Host vs-ssh.visualstudio.com <-- hostname found in my repo SSH URL
    IdentityFile ~/.ssh/id_rsa_vsonline <-- your key name
    IdentitiesOnly yes

然后用它进行了测试。
ssh -v vs-ssh.visualstudio.com

在这个跟踪中,我得到了类似于以下内容的信息:

验证通过 vs-ssh.visualstudio.com ([IP]:22)。

(备注:此处的 IP 地址是被替换掉的实际地址)

1
对于Azure DevOps,您需要配置SSH以明确使用特定的密钥文件。一种方法是创建或编辑配置文件。此配置文件必须在一起。例如,在您的~/.ssh/config文件(/home/User/.ssh或C:\Users\User.ssh)中如下所示:
Host ssh.dev.azure.com
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes

Host vs-ssh.visualstudio.com
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes

1
当您在Azure DevOps的设置页面上粘贴密钥时,请不要更改任何内容,包括在公钥末尾附加的空格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接