无法与 XX.XXX.XX.XX 协商: 找不到匹配的主机密钥类型。他们的报价: ssh-dss

我试图在我的网络主机上创建一个 git 存储库,并在我的计算机上克隆它。我是这么做的:

  1. 我在远程服务器上创建了一个存储库。
  2. 我生成了一个密钥对: ssh-keygen -t dsa
  3. 我把我的钥匙加到 ssh-agent。
  4. 我复制到 ~/.ssh中的服务器公钥。

然后,在尝试运行命令 git clone ssh://user@host/path-to-repository之后,我得到一个错误:

无法与 XX.XXX.XX.XX 协商: 找不到匹配的主机密钥类型。他们的报价: ssh-dss
无法从远程存储库读取。
请确保您拥有正确的访问权限,并且存在存储库。

那是什么意思?

179954 次浏览

最近的 openssh 版本默认不推荐使用 DSA 密钥。您应该建议您的 GIT 提供商添加一些合理的主机密钥。仅仅依靠 DSA 不是一个好主意。

作为一种解决方案,您需要告诉您的 ssh客户机您想要接受 DSA 主机密钥,如 遗留使用的官方文档中所述。您有很少的可能性,但我建议将这些行添加到您的 ~/.ssh/config文件中:

Host your-remote-host
HostkeyAlgorithms +ssh-dss

另一种可能性是使用环境变量 GIT_SSH来指定这些选项:

GIT_SSH_COMMAND="ssh -oHostKeyAlgorithms=+ssh-dss" git clone ssh://user@host/path-to-repository

您还可以在 ssh 行中添加 -oHostKeyAlgorithms=+ssh-dss:

ssh -oHostKeyAlgorithms=+ssh-dss user@host

对我来说,这个方法奏效了: (添加到 .ssh\config)

Host *
HostkeyAlgorithms +ssh-dss
PubkeyAcceptedKeyTypes +ssh-dss

如果您希望将这个安全漏洞包含在单个回购中,那么您可以通过在这些回购中运行这个命令,向任何需要该安全漏洞的 Git 回购添加一个配置选项。(注: 只适用于 git 版本 > = 2.10,发布于2016-09-04)

git config core.sshCommand 'ssh -oHostKeyAlgorithms=+ssh-dss'

然而,这只有在回购建立之后才有效。如果你不喜欢手动添加一个远程程序(只是想克隆) ,那么你可以这样运行克隆:

GIT_SSH_COMMAND='ssh -oHostKeyAlgorithms=+ssh-dss' git clone ssh://user@host/path-to-repository

然后运行第一个命令使其永久化。

如果您没有最新的 Git,并且仍然希望尽可能保持漏洞的局部性,我建议将

export GIT_SSH_COMMAND='ssh -oHostKeyAlgorithms=+ssh-dss'

在一个文件的地方,说 git_ssh_allow_dsa_keys.sh,并在需要的时候 sourceing 它。

你要么按照上面的方法,要么按照这个方法

在. ssh 目录中创建配置文件并添加以下行。

host xxx.xxx
Hostname xxx.xxx
IdentityFile ~/.ssh/id_rsa
User xxx
KexAlgorithms +diffie-hellman-group1-sha1

我想与服务器端的解决方案进行一些协作。因此,服务器说它不支持 DSA,这是因为 Openssh 客户机默认情况下不激活它:

OpenSSH 7.0和更高版本类似地禁用 ssh-dss (DSA)公钥算法。它也很弱,我们建议不要使用它。

因此,要在服务器端解决这个问题,我应该激活其他密钥算法,如 RSA o ECDSA。我只是在局域网中的服务器出了点问题。 我建议如下:

更新 openssh:

yum update openssh-server

如果有 sshd _ config. rpmnew,则在 sshd _ config 中合并新配置。

验证/etc/ssh/处是否有主机键。如果没有生成新的主机键,请参见 man ssh-keygen

$ ll /etc/ssh/
total 580
-rw-r--r--. 1 root root     553185 Mar  3  2017 moduli
-rw-r--r--. 1 root root       1874 Mar  3  2017 ssh_config
drwxr-xr-x. 2 root root       4096 Apr 17 17:56 ssh_config.d
-rw-------. 1 root root       3887 Mar  3  2017 sshd_config
-rw-r-----. 1 root ssh_keys    227 Aug 30 15:33 ssh_host_ecdsa_key
-rw-r--r--. 1 root root        162 Aug 30 15:33 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys    387 Aug 30 15:33 ssh_host_ed25519_key
-rw-r--r--. 1 root root         82 Aug 30 15:33 ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys   1675 Aug 30 15:33 ssh_host_rsa_key
-rw-r--r--. 1 root root        382 Aug 30 15:33 ssh_host_rsa_key.pub

在/etc/ssh/sshd _ config 中验证 HostKey 配置。它应该允许配置 RSA 和 ECDSA。(如果默认情况下它们都被注释了,那么它也允许 RSA,参见 man sshd_config中 HostKey 的部分)。

# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

对于客户端,只需这样做就可以为 ssh 创建一个密钥(而不是问题中提到的 DSA) :

ssh-keygen

在此之后,由于有比 ssh-dss (DSA)更多的选项,客户机 openssh (> = v7)应该连接到 RSA 或更好的算法。

这是另一篇好文章。

这是我回答的第一个问题,欢迎大家提出建议。

在我的 bitbucket 案例中,以下方法起作用了。

Host yourhost(ex: bitbucket.com)
User git
PubkeyAcceptedAlgorithms +ssh-rsa
HostkeyAlgorithms +ssh-rsa