Erro Git: "Falha na verificação da chave do host" ao conectar-se ao repositório remoto

221

Estou tentando conectar-me a um repositório Git remoto que reside no meu servidor web e cloná-lo na minha máquina.

Estou usando o seguinte formato para o meu comando:

git clone ssh://[email protected]/repository.git

Isso funcionou bem para a maioria dos membros da minha equipe. Geralmente, depois de executar este comando, o Git solicita a senha do usuário e, em seguida, executa a clonagem. No entanto, ao executar em uma das minhas máquinas, recebo o seguinte erro:

Falha na verificação da chave do host.

fatal: Não foi possível ler do repositório remoto.

Não estamos usando chaves SSH para conectar-se a este repositório, por isso não sei por que o Git está procurando uma nessa máquina específica.

bootsz
fonte
1
Você está usando SSH para conectar-se a este repositório, observe como o seu URL começa comssh://
Brandon
Eu tenho um problema semelhante . Alguém pode me ajudar por favor? Estou preso :(
SepSol 10/03

Respostas:

164

Você está se conectando através do protocolo SSH, conforme indicado pelo ssh://prefixo no URL do seu clone. Usando o SSH, todo host possui uma chave. Os clientes lembram-se da chave do host associada a um endereço específico e recusam-se a conectar-se se uma chave do host parecer mudar. Isso evita ataques do homem no meio.

A chave do host para domain.com foi alterada. Se isso não lhe parecer suspeito , remova a chave antiga do cache local editando ${HOME}/.ssh/known_hostspara remover a linha de domain.com ou permitindo que um utilitário SSH faça isso por você com

ssh-keygen -R domain.com

A partir daqui, registre a chave atualizada, fazendo você mesmo com

ssh-keyscan -t rsa domain.com >> ~/.ssh/known_hosts

ou, de forma equivalente, vamos sshfazer isso por você na próxima vez que você se conectar com git fetch, git pullou git push(ou mesmo um simples ol' ssh domain.com), respondendo sim quando for solicitado

A autenticidade do host 'domain.com (abcd)' não pode ser estabelecida.
A impressão digital da chave RSA é XX: XX: ...: XX.
Tem certeza de que deseja continuar se conectando (sim / não)?

A razão para esse prompt é domain.com não está mais no seu known_hostsdepois de excluí-lo e, presumivelmente, não está no sistema /etc/ssh/ssh_known_hosts, portanto ssh, não há como saber se o host do outro lado da conexão é realmente domain.com. (Se a chave errada estiver /etcinserida, alguém com privilégios administrativos precisará atualizar o arquivo em todo o sistema.)

É altamente recomendável que você também tenha usuários autenticados com chaves. Dessa forma, ssh-agentpode armazenar material de chave por conveniência (em vez de todos terem que digitar sua senha para cada conexão com o servidor), e as senhas não passam pela rede.

Greg Bacon
fonte
3
De fato, a execução sudo ssh-keygen -R domain.compode renomear seu known_hostsarquivo existente known_hosts.olde criar uma cópia que seja legível apenas pela raiz . ( -rw------- root root) Você pode facilmente chownvoltar para o usuário apropriado, mas também pode perder uma tarde depurando por que o git está quebrado. : D
Andrew Rueckert
1
Are you sure you want to continue connecting (yes/no)?. Não cometa o mesmo erro que eu. Você precisa digitar yes. Simplesmente pressionar enter não seleciona sim por padrão
JolonB
305

Como eu respondi anteriormente em Cloning, o git repo causa erro - a verificação da chave do host falhou. fatal: A extremidade remota desligou inesperadamente , adicione o GitHub à lista de hosts autorizados:

ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts

Tupy
fonte
3
Essa é a maneira mais segura, exceto por já ter a chave presente. Isso pressupõe que você o execute apenas uma vez, nem sempre que você se conectar ao servidor.
Zenexer
Repositório ajuste privada da minha empresa está usando ecdsa como chave, por isso, se a solução não está funcionando, talvez seja porque o algoritmo não é correto
Fendy
8
Essa deve ser a resposta aceita. Obrigado por salvar o meu dia.
Keyur
trabalhou para mim também, eu estava me perguntando por que eu não poderia clonar meu próprio repo
StackAttack
Alguém sinalizou esta postagem (incorretamente). Da revisão .
Wai Ha Lee
55

Eu tive o problema semelhante, mas usando as chaves SSH. Da resposta de Tupy, acima, eu descobri que o problema é que o arquivo known_hosts não está presente ou o github.com não está presente na lista de hosts conhecidos. Aqui estão as etapas que segui para resolvê-lo -

  1. mkdir -p ~/.ssh
  2. ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
  3. ssh-keygen -t rsa -C "user.email"
  4. abra a chave pública com este comando $ cat ~/.ssh/id_rsa.pube copie-o.
  5. Adicione a chave id_rsa.pub à lista de chaves SSH no seu perfil do GitHub.
Saran
fonte
1
@OJFord FYI: Eu editei a resposta original de uma maneira que torna seu comentário obsoleto. TBH e com todo o respeito, não estava totalmente correto em primeiro lugar. O touchcomando falharia caso o ~/.sshdiretório não existisse, portanto a etapa 1 ainda era necessária. Além disso, você não precisa touchdo arquivo antes de usar o >>redirecionamento. Ele será criado se necessário (mas apenas o arquivo, não o caminho inteiro, ainda mkdir -pé necessário). A -popção faz com que funcione caso o diretório já exista.
Tad Lispy
1
É o # 2 ssh-keyscanque falta nos documentos do Github para adicionar uma nova chave ssh.
Phil Andrews
1
Eu estava tendo problemas com Dockerfilea falta de permissão. A adição do segundo passo aqui corrigiu esse problema! Obrigado pelo excelente trabalho
Spencer Pollock
37

Isso está acontecendo porque o github não está atualmente em seus hosts conhecidos.

Você deve ser solicitado a adicionar o github aos seus hosts conhecidos. Se isso não aconteceu, você pode executar ssh -T [email protected]para receber o prompt novamente.

Powderham
fonte
2
Esta é a resposta certa se você nunca for solicitado.
Matthias Hagemann
15

Para mim, bastava digitar "yes" no prompt que pergunta "Tem certeza de que deseja continuar se conectando (yes / no)?" ao invés de pressionar Enter.

Code-Apprentice
fonte
Essa resposta me levam a perceber que eu tinha para clonar manualmente meu repo no meu servidor de compilação, a fim de tipo 'sim' e buscar o meu servidor bitbucket adicionado aos meus known_hosts
Sashah
1
@ Sashah Se tudo o que você precisa é do servidor de bitbucket em known_hosts, você pode editar o arquivo manualmente. Não é necessário clonar o repositório, se esse for o único motivo para fazê-lo.
Code-Apprentice
7

Eu tive o mesmo problema em um sistema recém-instalado, mas este era um problema do udev. Não havia /dev/ttynó, então eu tive que fazer:

mknod -m 666 /dev/tty c 5 0
Geoffroy
fonte
1
Funcionou para mim porque / dev / tty foi criado como um arquivo, muito estranho! (para você ter para removê-lo, em seguida, recriá-lo com mknod)
Doomsday
@Geoffroy, tirei / dev / tty e agora quando fazer sudo, eu enfrentar este erro: sudo: desculpe, você deve ter um tty para executar sudo
Milad
@ xe4me Eu nunca disse que você deveria removê-lo, dependendo do sistema que é realmente necessário. A reinicialização deve corrigi-lo.
Geoffroy
@ Geoffroy, na verdade o primeiro comentarista, disse que eu tenho que remover e recriar: d Não, a reinicialização não funcionou, eu tive que dizer a raiz, ele corrigiu: d
Milad
6

Se você estiver na intranet do escritório (caso contrário, perigosa), sempre protegida por firewalls, basta ter as seguintes linhas em ~ / .ssh / config

Host *
StrictHostKeyChecking no
UserKnownHostsFile = / dev / null

tomar sol
fonte
2
Isso ainda é perigoso, com o nosso sem firewalls corporativos. Como você sabe que está falando com o github real sem verificar a chave do servidor?
Mnebuerquo 17/03/19
1
Em ambientes corporativos, os repositórios git locais são usados ​​principalmente, nunca um de código aberto. Na pior das hipóteses, a configuração .ssh na parte superior do arquivo pode ter linhas explícitas de configuração relacionadas ao host do github para que o ssh escolha correspondências mais específicas.
sunil
5

O que funcionou para mim foi primeiro adicionar minha chave SSH do novo computador, segui estas instruções do GitLab - adicionar chave SSH . Observe que, como estou no Win10, tive que executar todos esses comandos no Git Bash no Windows (não funcionou no cmd comum do DOS).

Então, novamente, no Git Bash, tive que fazer um git clonerepo com o qual tive problemas e, no meu caso, tive que cloná-lo para um nome diferente, pois já o tinha localmente e não queria perder meus compromissos. Por exemplo

git clone ssh://git@gitServerUrl/myRepo.git myRepo2

Então eu recebi o prompt para adicioná-lo à lista de hosts conhecidos, a pergunta pode ser esta:

Tem certeza de que deseja continuar se conectando (sim / não)?

Eu digitei "yes" e finalmente funcionou, você normalmente deve receber uma mensagem semelhante a esta:

Aviso: permanentemente adicionado '[seu link de repo]' (ECDSA) à lista de hosts conhecidos.

Nota : se você estiver no Windows, certifique-se de usar o Git Bash para todos os comandos; isso não funcionou no cmd shell ou no PowerShell, eu realmente tive que fazer isso no Git Bash.

Por fim, apaguei o segundo repo clone ( myRepo2no exemplo) e voltei ao meu primeiro repo e finalmente pude fazer todas as coisas do Git normalmente no meu editor favorito VSCode.

ghiscoding
fonte
Na verdade, meu prompt do Cygwin se parece quase exatamente com o meu prompt do git bash, mas só funciona no prompt do git bash!
Josiah Yoder
3

Se você estiver usando o git para Windows.

  • Abra a GUI do git.
  • Abra o repositório git local na GUI do git.
  • Adicione o controle remoto ou pressione se o controle remoto já existir.
  • Responda "sim" à pergunta sobre se você deseja continuar.

O cliente da GUI adiciona a chave para você ~/.ssh/known_hosts. É mais fácil lembrar se você não faz isso com frequência e evita a necessidade de usar a linha de comando git (as linhas de comando padrão do Windows não têm o ssh-keyscanexecutável.

Julian Knight
fonte
2

Quando o servidor remoto deseja se conectar ao repositório particular, ele será autenticado via ssh. Crie o par de chaves público-privado com ssh-keygen ou se você já possui a chave público-privada. copie e cole a chave pública nas Configurações do repositório particular.

YourPrivateRepo -> Configurações -> Implementar chaves -> Adicionar chave de implantação -> Colar a chave pública.

Agora, o servidor remoto poderá se conectar ao repositório particular.

NOTA: As chaves de implantação têm acesso apenas para a leitura do repositório. Precisa permitir explicitamente o acesso de gravação.

Sandy
fonte
1

Isso significa que sua chave do host remoto foi alterada (pode ser a alteração da senha do host),

Seu terminal sugeriu executar este comando como usuário root

$ ssh-keygen -f "/root/.ssh/known_hosts" -R [www.website.net]

Você precisa remover esse nome de host da lista de hosts no seu PC / servidor. Copie esse comando sugerido e execute como um usuário root.

$ sudo su                                                        // Login as a root user

$ ssh-keygen -f "/root/.ssh/known_hosts" -R [www.website.net]    // Terminal suggested command execute here
Host [www.website.net]:4231 found: line 16 type ECDSA
/root/.ssh/known_hosts updated.
Original contents retained as /root/.ssh/known_hosts.old

$ exit                                                           // Exist from root user

Tente novamente. Espero que funcione.

Jay Patel
fonte
Nota: dependendo do seu shell, pode ser necessário escapar dos colchetes \ [e \] ou usar aspas.
Phlarx
1

Quando perguntado:

Are you sure you want to continue connecting (yes/no)?

Digite yes como resposta

Foi assim que resolvi meu problema. Mas se você tentar apenas pressionar o botão Enter, não funcionará!

shutsuke
fonte
0

Você pode usar o seu "git url" no formato de URL 'https' no arquivo Jenkins ou onde quiser.

git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'

Nitin
fonte
0

Eu estava enfrentando o mesmo erro no DockerFile durante o tempo de compilação, enquanto a imagem era pública. Fiz poucas modificações no Dockerfile.

 RUN git clone  https://github.com/kacole2/express-node-mongo-skeleton.git /www/nodejs

Isso ocorre porque o uso da sintaxe [email protected]: ... acaba usando SSH para clonar e, dentro do contêiner, sua chave privada não está disponível. Você deseja usar o RUN git clone> https://github.com/edenhill/librdkafka.git .

Adiii
fonte
-1

Eu tive o problema semelhante, infelizmente, usei a HMI do GitExtensions e esqueci que escrevi uma senha. Com HMI .... esqueça! Não digite a senha quando você gerar sua chave!

Jerome Vacher
fonte
-4

Recebi esta mensagem quando tentei git cloneum repositório que não era meu. A solução foi bifurcar e depois clonar.

fyodrs
fonte