Incapaz de negociar com XX.XXX.XX.XX: nenhum tipo de chave de host correspondente encontrado. A oferta deles: ssh-dss

110

Estou tentando criar um repositório git em meu host da web e cloná-lo no meu computador. Aqui está o que eu fiz:

  1. Criei um repositório no servidor remoto.
  2. Eu gerado um par de chaves: ssh-keygen -t dsa.
  3. Eu adicionei minha chave para ssh-agent.
  4. Copiei para a chave pública do servidor ~/.ssh.

E então, após uma tentativa de executar o comando git clone ssh://user@host/path-to-repository, recebo um erro:

Incapaz de negociar com XX.XXX.XX.XX: nenhum tipo de chave de host correspondente encontrado. Sua oferta: ssh-dss
fatal: não foi possível ler do repositório remoto.
Certifique-se de que possui os direitos de acesso corretos e de que o repositório existe.

O que isso significa?

Nikita Gorshkov
fonte

Respostas:

171

A versão recente do openssh tornou as chaves DSA obsoletas por padrão. Você deve sugerir ao seu provedor GIT para adicionar alguma chave de host razoável. Confiar apenas em DSA não é uma boa ideia.

Como alternativa, você precisa dizer ao seu sshcliente que deseja aceitar as chaves de host DSA, conforme descrito na documentação oficial para uso legado . Você tem poucas possibilidades, mas recomendo adicionar estas linhas ao seu ~/.ssh/configarquivo:

Host your-remote-host
    HostkeyAlgorithms +ssh-dss

Outra possibilidade é usar a variável de ambiente GIT_SSHpara especificar estas opções:

GIT_SSH_COMMAND="ssh -oHostKeyAlgorithms=+ssh-dss" git clone ssh://user@host/path-to-repository
Jakuje
fonte
1
Agora funcionou sem especificar o nome do host, apenas com HostkeyAlgorithms +ssh-dss. Obrigado.
giovannipds
1
@giovannipds Certamente precisa ser o host remoto ao qual você está se conectando. @ downvoters Explicar os downvotes seria bom.
Jakuje
@Jakuje desculpe cara, eu cliquei errado, e por causa da impossibilidade de mudar imediatamente, não pude atualizar minha resposta.
giovannipds
1
@Jakuje Já atualizei meu voto, só para avisar. =)
giovannipds
Se não houver tal arquivo em seu diretório .ssh, um arquivo de texto vazio chamado "config" será suficiente.
RMorrisey de
78

Você também pode adicionar -oHostKeyAlgorithms=+ssh-dssem sua linha ssh:

ssh -oHostKeyAlgorithms=+ssh-dss user@host
Guillaume
fonte
Esta é a solução mais rápida +1 porque também corrige permanentemente o problema para aquele host. Mais uma sugestão para o longo prazo é que, se possível, o sistema host deve ter seu daemon SSH atualizado, pois parece que o DSS não é mais considerado muito seguro.
Areeb Soo Yasir de
20

Para mim, funcionou: (adicionado em .ssh\config)

Host *
HostkeyAlgorithms +ssh-dss
PubkeyAcceptedKeyTypes +ssh-dss
user2885534
fonte
A segunda opção não está relacionada ao problema e a primeira já foi mencionada na minha resposta.
Jakuje
Host your-host não funcionou para mim, desde que your-host seja o nome do host do qual estou executando o comando ssh (cliente). Mas o Host * funcionou para mim.
Krischu
2
@Krischu não, yuor-hosté o host sshcontra o qual você está executando . Definir um padrão não seguro para todos os hosts é sempre uma má ideia.
Jakuje
10

Se você é como eu e prefere não tornar este sistema de falha de segurança ou para todo o usuário, você pode adicionar uma opção de configuração a qualquer repositório git que precise disso, executando este comando nesses repositórios. (observe que só funciona com a versão git> = 2.10, lançada em 04/09/2016)

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

No entanto, isso só funciona após a configuração do repo. Se você não se sentir confortável em adicionar um controle remoto manualmente (e quiser apenas clonar), execute o clone assim:

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

em seguida, execute o primeiro comando para torná-lo permanente.

Se você não tiver o mais recente e ainda quiser manter o buraco o mais local possível, recomendo colocar

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

em um arquivo em algum lugar, digamos git_ssh_allow_dsa_keys.sh, e sourceinstalá-lo quando necessário.

golvok
fonte
3

Quero colaborar um pouco com a solução para o lado servidor. Então, o servidor está dizendo que não suporta DSA, isso ocorre porque o cliente openssh não o ativa por padrão :

O OpenSSH 7.0 e superior desabilitam de forma semelhante o algoritmo de chave pública ssh-dss (DSA). Também é fraco e não recomendamos seu uso.

Então, para consertar isso no lado do servidor, devo ativar outros algoritmos de chave como RSA ou ECDSA. Acabei de ter esse problema com um servidor em uma lan. Eu sugiro o seguinte:

Atualize o openssh:

yum update openssh-server

Mesclar novas configurações no sshd_config se houver um sshd_config.rpmnew.

Verifique se há chaves de hosts em / etc / ssh /. Se não gerar novos, veja 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

Verifique em / etc / ssh / sshd_config a configuração do HostKey. Deve permitir a configuração de RSA e ECDSA. (Se todos eles forem comentados por padrão, também permitirá o RSA, veja na man sshd_configparte de 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

Para o lado do cliente, crie uma chave para ssh (não um DSA como na pergunta) apenas fazendo isto:

ssh-keygen

Depois disso, como há mais opções do que ssh-dss (DSA), o cliente openssh (> = v7) deve se conectar com RSA ou algoritmo melhor.

Aqui está outro bom artigo.

Esta é a minha primeira pergunta respondida, agradeço sugestões: D.

Gus Calca
fonte
1

Como especificar vários algoritmos? Eu pergunto porque o git acabou de atualizar no meu laptop de trabalho (Windows 10, usando a compilação oficial do Git para Windows) e recebi este erro quando tentei enviar um branch de projeto para o meu Azure DevOps remoto. Tentei empurrar --set-upstream e consegui isso:

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.

Então, como alguém implementaria as sugestões acima, permitindo ambos? (Como uma solução rápida, usei a solução de @golvok com group14 e funcionou, mas realmente não sei se 1 ou 14 é melhor, etc.)

Janet
fonte
-3

Você pode seguir a abordagem acima ou esta

Crie o arquivo de configuração no diretório .ssh e inclua essas linhas.

host xxx.xxx
 Hostname xxx.xxx
 IdentityFile ~/.ssh/id_rsa
 User xxx
 KexAlgorithms +diffie-hellman-group1-sha1
Ashokhein
fonte
Isso está resolvendo um problema completamente diferente.
Jakuje