Skip to content

SSH连接错误:no matching host key type found. Their offer: ssh-rsa

问题描述

在使用Git或SSH连接远程仓库时,你可能会遇到以下错误信息:

bash
$ 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.

这个错误通常发生在较新版本的OpenSSH客户端(8.2及以上版本)尝试连接仅支持传统ssh-rsa算法的主机时。

错误原因

OpenSSH在2020年发布的8.2版本中出于安全考虑,默认禁用ssh-rsa签名算法,因为它使用不安全的SHA-1哈希算法。但许多远程服务器(尤其是Azure DevOps等平台)仍然仅支持这种较旧的算法,导致客户端和服务器无法协商出共同支持的主机密钥类型。

安全提醒

虽然本文提供解决方案,但请注意ssh-rsa算法确实存在安全风险。建议优先考虑使用HTTPS协议或敦促服务提供商升级到更安全的算法。

解决方案

方法一:修改SSH客户端配置(推荐)

~/.ssh/config文件中添加特定主机的配置:

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

# 对于Azure DevOps的额外配置
Host vs-ssh.visualstudio.com
  PubkeyAcceptedAlgorithms +ssh-rsa
  HostkeyAlgorithms +ssh-rsa
其他常见平台配置
ssh-config
# 对于Bitbucket
Host bitbucket.org
  PubkeyAcceptedAlgorithms +ssh-rsa
  HostkeyAlgorithms +ssh-rsa

# 自定义服务器
Host your-server-domain.com
  PubkeyAcceptedAlgorithms +ssh-rsa
  HostkeyAlgorithms +ssh-rsa

方法二:临时命令行解决方案

对于一次性连接,可以直接在命令行中指定算法:

bash
# SSH连接
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa user@hostname

# SCP传输文件
scp -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa file user@hostname:path

# Git操作(设置临时环境变量)
GIT_SSH_COMMAND="ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa" git pull

方法三:系统级配置(适用于特定环境)

在某些情况下,可能需要修改系统级SSH配置:

  1. macOS系统:编辑/etc/ssh/ssh_config文件
  2. Linux系统(如Ubuntu):编辑/etc/ssh/sshd_config文件
  3. NixOS系统:在configuration.nix中添加:
    nix
    programs.ssh.extraConfig = ''
      PubkeyAcceptedAlgorithms +ssh-rsa
      HostkeyAlgorithms +ssh-rsa
    '';

配置详解

ssh-config
Host example.com
  HostName example.com           # 实际主机名
  User your-username            # 登录用户名
  IdentityFile ~/.ssh/id_rsa    # 私钥文件路径
  IdentitiesOnly yes            # 仅使用指定身份文件
  PubkeyAcceptedAlgorithms +ssh-rsa  # 启用ssh-rsa公钥算法
  HostkeyAlgorithms +ssh-rsa         # 启用ssh-rsa主机密钥算法
bash
# 测试SSH连接
ssh -T git@ssh.dev.azure.com

# 检查配置是否生效
ssh -G ssh.dev.azure.com | grep -E "(hostkey|pubkey)"

创建SSH配置文件

如果还没有SSH配置文件,可以按以下步骤创建:

  1. 打开终端
  2. 进入SSH目录:cd ~/.ssh/
  3. 创建配置文件:touch config
  4. 编辑配置文件:nano config(或使用其他文本编辑器)
  5. 添加相应的配置内容并保存

安全建议

  1. 优先使用HTTPS:如果服务支持,考虑使用HTTPS协议代替SSH
  2. 督促服务商升级:联系你的Git服务提供商(如Azure DevOps),要求他们支持更安全的密钥算法(如rsa-sha2-256ed25519
  3. 定期更新:关注服务商的安全更新,一旦支持更安全的算法,立即移除临时配置

总结

"no matching host key type found"错误是由于OpenSSH客户端安全升级导致的兼容性问题。通过修改SSH配置可以临时解决此问题,但长期来看应该推动服务提供商升级到更安全的加密算法。

注意

不同平台和OpenSSH版本可能有细微差异,如果上述方法无效,请检查你的SSH版本(ssh -V)并查阅相关平台的特定文档。