Git错误:未找到匹配的主机密钥类型。他们提供的是:ssh-rsa。

218

在使用 git 时,我遇到了以下错误:

$ git pull
Unable to negotiate with 172.16.42.42 port 22: no matching host key type found. Their offer: ssh-rsa
fatal: Could not read from remote repository.

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

我该如何解决这个错误?


还在 https://public-inbox.org/git/CAHo1AWxzPsnLuT8JRWovtaRrGvRS8+0NyucU5K8VEnaL1xxW3Q@mail.gmail.com/T/#u 中讨论过。 - VonC
17个回答

394

使用SSH时,有几种不同类型的密钥,其中RSA密钥(ssh-rsa)类型可以支持多种签名类型。签名类型 ssh-rsa指的是带有SHA-1的RSA,而签名类型rsa-sha2-256是带有SHA-256的RSA,rsa-sha2-512是带有SHA-512的RSA。

在Azure DevOps中,它仅支持带有SHA-1的RSA类型,而SHA-1被认为非常脆弱。这基本上意味着没有安全的方法通过SSH连接到它,直到他们修复问题,最好使用HTTPS或其他托管服务。GitHub,GitLab和Bitbucket都支持安全的身份验证方法。

如果您真的需要目前使用SSH与Azure DevOps,请向~/.ssh/config文件添加一个条目以解决此问题:

Host ssh.dev.azure.com
    User git
    PubkeyAcceptedAlgorithms +ssh-rsa
    HostkeyAlgorithms +ssh-rsa

然而,请注意这只是一种解决问题的方法,已知存在安全隐患,因此您应该联系Azure DevOps解决此问题并切换到HTTPS,或者迁移到其他地方。


5
啊哈!这终于解决了我SSH的问题。尝试了很多其他选项。 - twhitney
也许值得每个季节或两个季节检查一次,并在主机更新以支持更好的密码时进行删除。 - Tomachi
4
在Cygwin的git更新了从2.32到2.34之后,我遇到了这个问题,这个答案解决了它,谢谢! - okharch
2
不幸的是,将此选项放入“~/.ssh/config”可能会破坏依赖于旧版OpenSSH的其他软件。最终我使用了一个已弃用的名称PubkeyAcceptedKeyTypes而不是PubkeyAcceptedAlgorithms(如此处所述)。 - Nickolay
1
这解决了我在一个长时间未更新的自托管Bitbucket服务器上遇到的同样问题。他们在论坛上列出了相同的解决方案 - mulllhausen
显示剩余5条评论

100

如果连接的服务器提供了ssh-rsaRSA/SHA1)进行身份验证,OpenSSH将报告错误no matching host key type found. Their offer: ssh-rsa

Azure Devops(TFS)提供使用ssh-rsa进行身份验证。正如bk2204的答案中所指出的那样,此算法不被认为是密码学安全的。

由于它被认为是弱的,OpenSSH在2020-02-14的版本8.2废弃了使用SHA-1

现在可以[1]以低于50,000美元的价格对SHA-1哈希算法执行选择前缀攻击。因此,在不久的将来的发布版本中,默认情况下禁用依赖于SHA-1的“ssh-rsa”公钥签名算法。

Azure Devops 服务随后宣布修补程序以允许SHA-2

2021年5月5日,Azure DevOps文档更新,提到使用RSA 3072

问:这是真的吗?

¯\_(ツ)_/¯

问:支持哪些算法?

没有地方说。可能只支持ssh-rsa

问:如何使用密码学不安全的算法?

添加此内容

  HostkeyAlgorithms +ssh-rsa
  PubkeyAcceptedAlgorithms +ssh-rsa

打开你的~/.ssh/config文件

Host your-azure-devops-domain
  IdentityFile ~/.ssh/id_rsa
  IdentitiesOnly yes
  HostkeyAlgorithms +ssh-rsa
  PubkeyAcceptedAlgorithms +ssh-rsa

问题:微软知道这是个问题吗?

是的, 他们 知道。

问题:他们在意吗?

不, 这是一个 特性。


4
谢谢!在我更新到Ubuntu 22.04后,这个方法对我很有帮助。 - abaga129
6
截至2022-08-01,Azure DevOps服务仍在使用ssh-rsa,因此他们在2020年声称已修复该问题的说法是错误的。 - Sharparam

62
根据此帖子,您可以将ssh.dev.azure.com主机配置添加到~/.ssh/config文件中:

Final ~/.ssh/config that worked for me:

Host ssh.dev.azure.com
    HostName ssh.dev.azure.com
    User git
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    PubkeyAcceptedAlgorithms +ssh-rsa
    HostkeyAlgorithms +ssh-rsa

4
在设置CodeCommit之后,我遇到了相同的问题,将上述3行粘贴到SSH中成功进行了身份验证,谢谢!需要翻译的内容是:IdentitiesOnly yes PubkeyAcceptedAlgorithms +ssh-rsa HostkeyAlgorithms +ssh-rsa - Kunal Awasthi
但我还是卡住了。一切都正常,突然停止连接codecommit... - Ameer Ul Islam
3
这也适用于主机名,例如 vs-ssh.visualstudio.com - elulcao

49

scp或ssh可以使用此功能

ssh -p 22 -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa  user@myhost
# or scp
scp -P 22 -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa  user@myhost

ssh-keygen -f "/home/qmm0/.ssh/known_hosts" -R "[10.0.0.28]:2222";ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa 10.0.0.28 -p 2222 - CS QGB
SFTP:sftp -P 22 -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa user@myhost - Jesse Nickles
非常感谢您!这个也适用于Mac Ventura 13.4。 - woninana

20

对于使用Azure DevOps的用户,应使用以下〜/ .ssh / config ,因为Azure在其Clone Repository中返回URL时会有所不同:

Host ssh.dev.azure.com
  PubkeyAcceptedAlgorithms +ssh-rsa
  HostkeyAlgorithms +ssh-rsa

Host vs-ssh.visualstudio.com
  PubkeyAcceptedAlgorithms +ssh-rsa
  HostkeyAlgorithms +ssh-rsa

15
在你的~/.ssh/config文件中,添加这些行。
Host *.drush.in
    HostkeyAlgorithms +ssh-rsa
    PubkeyAcceptedAlgorithms +ssh-rsa

10

我也遇到了这个问题,以下方法适用于我:

cd ~/.ssh/
vim config

Host [Hostname]
User [User]
PubkeyAcceptedAlgorithms +ssh-rsa
HostkeyAlgorithms +ssh-rsa

我有几个主机名遇到了这个问题,所以现在我的ssh配置文件中有多个这样的配置。


和身份文件? - Ameer Ul Islam

9

这里有两个步骤:

  1. 将配置文件(无扩展名)添加到您的 ~/.ssh/ 目录中。

  2. 在配置文件中添加以下内容:

    HostkeyAlgorithms +ssh-rsa    
    PubkeyAcceptedAlgorithms +ssh-rsa
    

这对我有用,只需在~/.ssh/config中添加这两行就解决了我的问题,在Mac上更新到Sonoma后我的使用情况。 - undefined

4

对于已发布答案的更正。我遇到了相同的问题,通过以上代码片段并进行微小修复,我解决了它:

Host YOUR-DOMAIN
Hostname YOUR-DOMAIN
IdentityFile ~/.ssh/id_rsa
IdentitiesOnly yes
HostKeyAlgorithms=+ssh-rsa
PubkeyAcceptedAlgorithms=+ssh-rsa

不要忘记使用AzureDevOps上正在使用的域替换YOUR-DOMAIN

4

NixOS 21.11已将OpenSSH更新至8.8p1(请参见更新日志)。OpenSSH将ssh-rsa与其他几个不安全的密码一起弃用。

如果我理解正确,你只是使用nix作为软件包管理器而不是NixOS。如果是这种情况,您可以按照其余答案中的指南进行操作(编辑~/.ssh/config)。

但是,当您使用NixOS配置服务器时,可以通过向configuration.nix添加以下内容来重新启用ssh客户端的ssh-rsa

programs.ssh.extraConfig = ''
  PubkeyAcceptedAlgorithms +ssh-rsa
  HostkeyAlgorithms +ssh-rsa
''

为了重新启用不安全的ssh-rsa密码(例如当传统客户端连接服务器时),您可以简单地将以下行添加到您的configuration.nix文件中:
services.openssh.extraConfig = ''
  PubkeyAcceptedAlgorithms +ssh-rsa
  HostkeyAlgorithms +ssh-rsa
'';

1
谢谢,这正是我需要的。不幸的是,services.openssh部分有两个错别字(字母颠倒了)。我认为它应该是“PubkeyAcceptedAlgorithms”,就像programs.ssh部分一样。 - antifuchs
@antifuchs 谢谢,我已经更新了我的回复。 - makefu

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