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

无法与XX.XXX.XX.XX协商:未找到匹配的主机密钥类型。他们的提议:ssh-dss,ssh,web-hosting,Ssh,Web Hosting,我正在尝试在我的web主机上创建git存储库,并在我的计算机上克隆它。以下是我所做的: 我在远程服务器上创建了一个存储库 我生成了一个密钥对:ssh-keygen-tdsa 我将密钥添加到ssh代理 我在~/.ssh中将公钥复制到服务器 然后,在尝试运行命令git clone之后ssh://user@主机/存储库路径,我收到一个错误: 无法与XX.XXX.XX.XX协商:未找到匹配的主机密钥类型。他们的报价:ssh dss 致命:无法从远程存储库读取。 请确保您具有正确的访问权限,并且存储库存在

我正在尝试在我的web主机上创建git存储库,并在我的计算机上克隆它。以下是我所做的:

  • 我在远程服务器上创建了一个存储库
  • 我生成了一个密钥对:
    ssh-keygen-tdsa
  • 我将密钥添加到ssh代理
  • 我在
    ~/.ssh
    中将公钥复制到服务器
  • 然后,在尝试运行命令
    git clone之后ssh://user@主机/存储库路径
    ,我收到一个错误:

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


    这意味着什么?

    最近的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


    如果您和我一样,不希望将此安全漏洞扩展到系统或用户范围,那么您可以通过在任何git repo中运行此命令,向任何需要此漏洞的git repo添加配置选项。(注:仅适用于2016-09-04发布的git版本>=2.10)

    然而,这仅在回购协议设置后有效。如果您不习惯手动添加远程设备(并且只想克隆),则可以按如下方式运行克隆:

    GIT_SSH_COMMAND='ssh -oHostKeyAlgorithms=+ssh-dss' git clone ssh://user@host/path-to-repository
    
    然后运行第一个命令使其永久化

    如果你没有最新的,但仍然想保持尽可能本地的洞,我建议把

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

    在某个文件中,比如说
    git\u ssh\u allow\u dsa\u keys.sh
    ,然后在需要时
    source
    将其删除。

    您要么遵循上述方法,要么遵循此方法

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

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

    我想与服务器端的解决方案进行一些协作。因此,服务器说它不支持DSA,这是因为:

    OpenSSH 7.0及更高版本同样禁用ssh dss(DSA)公钥算法。它也很弱,我们建议不要使用它

    因此,要在服务器端解决这个问题,我应该激活其他关键算法,如RSA o ECDSA。我刚刚在局域网的服务器上遇到了这个问题。 我建议如下:

    更新openssh:

    yum update openssh-server
    
    如果存在sshd_config.rpmnew,则在sshd_config中合并新配置

    验证/etc/ssh/上是否有主机密钥。如果不生成新的,请参阅
    manssh-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_配置中验证HostKey配置。它应该允许配置RSA和ECDSA。(如果默认情况下对它们都进行了注释,那么它也将允许RSA,请参见主机密钥部分中的
    mansshd_config

    对于客户端,只需执行以下操作,即可为ssh(而不是问题中的DSA)创建密钥:

    ssh-keygen
    
    在此之后,因为有比ssh-dss(DSA)更多的选项,所以客户端openssh(>=v7)应该与RSA或更好的算法连接


    这是我回答的第一个问题,我欢迎建议:D.

    如何指定多个算法?我这样问是因为git刚刚在我的工作笔记本电脑上更新过(Windows 10,使用官方的git for Windows build),当我试图将项目分支推送到我的Azure DevOps remote时,我遇到了这个错误。我试着往上游推,结果发现:

    Unable to negotiate with 20.44.80.98 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1
    fatal: Could not read from remote repository.
    
    Please make sure you have the correct access rights
    and the repository exists.
    

    那么,考虑到这两个因素,如何实施上述建议呢?(作为一个快速解决方案,我使用@golvok的group14解决方案,效果很好,但我真的不知道是1还是14更好,等等)

    第二个选项与问题无关,第一个选项已在我的回答中提到。主机您的主机不适用于我,前提是您的主机是我运行ssh命令的主机的名称(客户端). 但是Host*为我工作。@krishu不,
    yuor Host
    是您运行
    ssh
    的主机。为所有主机设置不安全的默认值总是一个坏主意。@Jakuje它并没有将其设置为不安全的默认值;作为最后手段,它将附加到默认列表中。从列表前的“+”命令ssh将算法附加到客户端的默认集,而不是替换默认集。通过附加,您将在服务器开始支持时自动升级到受支持的最佳算法。即使在万不得已的情况下启用1k DSA密钥也不是一个好主意。多年来它一直处于禁用状态,现在它在没有指定主机名的情况下工作,只使用了
    hostkeyalgoriths+ssh-dss
    。谢谢。@giovannipds它当然需要是您连接的远程主机。@向下投票人解释向下投票会很好。@Jakuje抱歉,我点击错了,因为无法立即更改,我无法更新我的答案。@Jakuje我已经更新了我的投票,只是想让你知道。=)如果.ssh目录中没有这样的文件,则可以使用名为“config”的空文本文件。这解决了完全不同的问题。请参阅这是最快的解决方案+1,因为它还永久性地修复了该主机的问题。从长远来看,还有一个建议是,如果可能的话,主机系统应该升级其SSH守护程序,因为它看起来不再是非常安全的DSS。与其将此作为答案发布,不如将其作为对原始问题的评论发布,或者问一个引用此问题的新问题。
    # 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-keygen
    
    Unable to negotiate with 20.44.80.98 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1
    fatal: Could not read from remote repository.
    
    Please make sure you have the correct access rights
    and the repository exists.