Git错误:连接到远程存储库时“主机密钥验证失败”

时间:2012-11-13 15:26:37

标签: git ssh ssh-keys

我正在尝试连接到位于我的Web服务器上的远程Git存储库,并将其克隆到我的计算机上。

我的命令使用以下格式:

git clone ssh://username@domain.com/repository.git

这对我的大多数团队成员来说都很好。通常在运行此命令后,Git会提示输入用户的密码,然后运行克隆。但是,当在我的一台机器上运行时,我收到以下错误:

  

主机密钥验证失败。

     

致命:无法从远程读取   库中。

我们没有使用SSH密钥连接到这个存储库,所以我不确定为什么Git会在这台特定的机器上检查一个。

23 个答案:

答案 0 :(得分:242)

正如我先前在Cloning git repo causes error - Host key verification failed. fatal: The remote end hung up unexpectedly中回答的那样,将GitHub添加到授权主机列表中:

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

答案 1 :(得分:87)

您正在通过SSH协议进行连接,如克隆URL上的ssh://前缀所示。使用SSH,每个主机都有一个密钥。客户端记住与特定地址关联的主机密钥,如果主机密钥似乎发生更改,则拒绝连接。这可以防止人在中间发作。

domain.com的主机密钥已更改。 如果这对您来说似乎有点可疑,请通过编辑${HOME}/.ssh/known_hosts删除domain.com的行,或者让SSH实用程序为您执行此操作,从本地缓存中删除旧密钥< / p>

ssh-keygen -R domain.com

从此处开始,通过

自行记录更新的密钥
ssh-keyscan -t rsa domain.com >> ~/.ssh/known_hosts

或等效地,让ssh在您下次与git fetchgit pullgit push(或甚至是普通的{'{{1}连接时为您执行此操作通过在提示时回答“是”

The authenticity of host 'domain.com (a.b.c.d)' can't be established.
RSA key fingerprint is XX:XX:...:XX.
Are you sure you want to continue connecting (yes/no)?

此提示的原因是domain.com在删除后不再在ssh domain.com中,可能不在系统的known_hosts中,因此/etc/ssh/ssh_known_hosts无法知道连接另一端的主机真的是domain.com。 (如果错误的密钥在ssh中,则具有管理权限的用户必须更新系统范围的文件。)

我强烈建议您考虑让用户使用密钥进行身份验证。这样,/etc可以存储密钥材料以方便使用(而不是每个人都必须为服务器的每个连接输入密码),并且密码不会通过网络传输。

答案 2 :(得分:36)

我有类似的问题,但是,使用SSH密钥。从上面的Tupy的回答中,我发现问题是known_hosts文件不存在或者github.com没有出现在已知主机列表中。以下是我解决它的步骤 -

  1. mkdir -p ~/.ssh
  2. ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
  3. ssh-keygen -t rsa -C "user.email"
  4. 使用此命令$ cat ~/.ssh/id_rsa.pub打开公钥并复制它。
  5. id_rsa.pub 键添加到GitHub配置文件的SSH密钥列表中。

答案 3 :(得分:22)

这种情况正在发生,因为github目前不在您的已知主机中。

系统会提示您将github添加到已知主机。如果没有发生这种情况,您可以运行ssh -T git@github.com再次收到提示。

答案 4 :(得分:10)

对我来说,我只需在提示符处输入“是”,询问“你确定要继续连接(是/否)?”而不是只按Enter键。

答案 5 :(得分:7)

我在新安装的系统上遇到了同样的问题,但这是一个udev问题。没有/dev/tty节点,所以我必须这样做:

mknod -m 666 /dev/tty c 5 0

答案 6 :(得分:6)

如果你在办公室内网(否则是危险的)总是受防火墙保护,只需在你的〜/ .ssh / config

中有以下几行

主持人*
  StrictHostKeyChecking没有   UserKnownHostsFile = / dev / null

答案 7 :(得分:4)

对我来说有用的是首先添加新计算机的SSH密钥,我按照GitLab - add SSH key中的说明进行操作。请注意,因为我在Win10上,我不得不在Windows上的Git Bash中执行所有这些命令(它不能在常规的DOS cmd Shell中工作)。

然后再次在Git Bash中,我不得不做一个我遇到问题的回复git clone,在我的情况下,我必须将它克隆到一个不同的名称,因为我已经在本地使用了它并没有&# 39;我想丢失我的提交。例如

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

然后我得到了将其添加到已知主机列表的提示,问题可能就是这个:

  

您确定要继续连接(是/否)吗?

我输了&#34;是&#34;它终于奏效了,你通常应该收到类似这样的消息:

  

警告:永久添加&#39; [您的回购链接]&#39; (ECDSA)到已知主机列表。

注意:如果您使用的是Windows,请确保使用Git Bash执行所有命令,这在常规cmd shell或PowerShell中无效,我真的不得不在Git Bash中执行此操作。

最后我删除了第二个克隆仓库(示例中为myRepo2)并回到我的第一个仓库,我最终可以在我最喜欢的编辑器VSCode中执行所有Git的操作。

答案 8 :(得分:2)

如果您正在使用git for Windows。

  • 打开git GUI。
  • 在git GUI中打开本地git存储库。
  • 如果遥控器已存在,请添加遥控器或推送。
  • 回答&#34;是&#34;关于你是否想继续的问题。

GUI客户端将您的密钥添加到~/.ssh/known_hosts。如果您不经常这样做并且也不需要使用git命令行(标准Windows命令行不具有ssh-keyscan可执行文件,则更容易记住。

答案 9 :(得分:2)

被问到:

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

输入作为响应

这就是我解决问题的方式。但是,如果您尝试仅按Enter键,它将无法正常工作!

答案 10 :(得分:1)

表示您的远程主机密钥已更改(可能是主机密码更改),

您的终端建议以root用户身份执行此命令

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

您必须从PC /服务器上的主机列表中删除该主机名。复制建议的命令并以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

再试一次,希望这有效。

答案 11 :(得分:0)

您可以使用&#34; git url&#34;在&#39; https&#34; Jenkins文件中的URL格式或您想要的任何位置。

TYPE_CLASS_NUMBER

答案 12 :(得分:0)

在镜像公开期间,在构建期间,我在DockerFile中遇到了相同的错误。我没有对Dockerfile进行任何修改。

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

这是因为使用git@github.com:...语法最终>使用SSH进行克隆,并且在容器内部,您的私钥不可用。您将要改用RUN git clone> https://github.com/edenhill/librdkafka.git

答案 13 :(得分:0)

我遇到了类似的问题,不幸的是我使用了GitExtensions HMI并忘记了我写了一个密码短语。 用HMI ......算了吧!生成密钥时请勿输入密码!

答案 14 :(得分:0)

当远程服务器想要连接到私有仓库时,它将通过ssh进行身份验证。 使用ssh-keygen或如果您已经具有公钥-私钥,创建私钥-公钥对。复制并粘贴私钥回购设置中的公钥。

YourPrivateRepo->设置->部署密钥->添加部署密钥->粘贴公共密钥。

现在,远程服务器将能够连接到专用存储库。

注意:部署密钥只能访问读取存储库。需要明确允许写访问。

答案 15 :(得分:0)

这里提到的解决方案很棒,唯一缺少的是,如果您的公钥和私钥文件名与默认文件名不同怎么办?

在〜/ .ssh下创建一个名为“ config”的文件,并添加以下内容

Host github.com
    IdentityFile ~/.ssh/github_id_rsa

用私钥文件替换github_id_rsa

答案 16 :(得分:0)

您可以使用https而不是ssh进行git clone或git pull或git push

例如:

git clone https://github.com/user/repo.git

答案 17 :(得分:0)

原因似乎是未存储远程主机的公共密钥或与存储的密钥不同。 (请注意安全性问题,有关详细信息,请参阅Greg Bacon的答案。)

在这种情况下,我习惯git clone提示我:

The authenticity of host 'host.net (10.0.0.42)' can't be established.
ECDSA key fingerprint is 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00.
Are you sure you want to continue connecting (yes/no)?

不确定,为什么会引发此错误。可能是您的Shell的配置或git SSH命令。<​​br/> 无论如何,您可以通过运行ssh user@host.net来获得相同的提示。

答案 18 :(得分:0)

另一种替代方法对我有用,而不是克隆 SSH 链接

git@gitlab.company.net:upendra/mycode.git

有一个选择http链接的选项

http://gitlab.company.net:8888/upendra/mycode.git

所以我使用 http 链接来克隆 Visual Studio,它对我有用

答案 19 :(得分:0)

Tupy's answer 的一个小补充,您可能需要为您的存储库主机添加端口号:

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

如果您有另一台可以远程访问的机器,您可以通过查看 ~/.ssh/known_hosts 找到端口号:

[user]$ less ~/.ssh/known_hosts
[domain.com]:8888,[000.00.000.000]:8888 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCi...

答案 20 :(得分:0)

如果您不使用 Windows Session 来更新代码,而使用 PortableGit,则需要在运行 git 命令之前设置 HOMEPATH 环境变量。

这个例子更适合for other use case,但我认为这是这篇文章的一个很好的概念证明。

$env:HOMEPATH="\Users\Administrator";C:\path\to\PortableGit\bin\git.exe -C C:\path\to\repository.git pull'

答案 21 :(得分:0)

推送到 Git 返回错误代码 403 致命:HTTP 请求失败

检查是否存在结算问题。 Google Cloud 停止将文件上传到 https://source.cloud.google.com/

在解决付款问题后,这个问题就消失了。 但没有更改密钥。

谢谢

答案 22 :(得分:-2)

当我尝试git clone一个不属于我的回购时,我收到了这条消息。解决方法是fork,然后克隆。