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


220

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

我的命令使用以下格式:

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

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

主机密钥验证失败。

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

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


1
正在使用SSH连接到此存储库,请注意您的URL开头为ssh://
Brandon

我有一个类似的问题。有人可以帮我吗?我被困住了:(
9

Answers:


162

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

domain.com的主机密钥已更改。如果您觉得这没用,请通过编辑${HOME}/.ssh/known_hosts以删除domain.com的行或通过SSH实用程序为您完成操作,从本地缓存中删除旧密钥。

ssh-keygen -R domain.com

在这里,您可以自己记录更新的密钥

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

或者等效地,ssh下一次与,或(甚至是简单的ol' )连接时git fetch,通过提示您回答“是” ,为您做git pullgit pushssh domain.com

无法建立主机“ domain.com(abcd)”的真实性。
RSA密钥指纹为XX:XX:...:XX。
您确定要继续连接(是/否)吗?

出现此提示的原因是domain.com known_hosts在删除后不再在您的手中,并且可能不在系统的目录中/etc/ssh/ssh_known_hosts,因此ssh无法知道连接另一端的主机是否真的是domain.com。(如果输入了错误的密钥,则/etc具有管理特权的人将不得不更新系统范围的文件。)

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


3
有趣的是,运行sudo ssh-keygen -R domain.com可以将现有known_hosts文件重命名为known_hosts.old,并创建一个只能由root读取的副本。(-rw------- root root)您可以轻松地将chown其返回给适当的用户,但是您也可能会花费一个下午的时间调试git为何被破坏。:D
安德鲁·鲁克特

1
Are you sure you want to continue connecting (yes/no)?。不要跟我犯同样的错误。您需要输入yes。只需按回车键默认情况下不会选择是
JolonB

304

正如我之前在克隆git repo中回答的那样,导致错误-主机密钥验证失败。致命:远端意外挂起,将GitHub添加到授权主机列表:

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


3
这是最安全的方法,因为缺少已经存在的密钥。假设您只运行一次,而不是每次连接服务器时都运行一次。
Zenexer 2015年

我公司的私人健身仓库使用ecdsa作为密钥,因此,如果解决方案不起作用,可能是因为算法不正确
Fendy 2016年

8
这应该是公认的答案。谢谢您保存我的一天。
Keyur '17

也为我工作,我想知道为什么我不能克隆自己的
仓库

有人标记了该帖子(错误地)。从评论
李慧夏

55

我有类似的问题,但是使用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密钥列表中。

1
@OJFord仅供参考:我已经编辑了原始答案,使您的评论过时了。TBH并在所有应有的尊重下,最初并不是完全正确的。touch如果~/.ssh目录不存在,该命令将失败,因此仍然需要执行步骤1。同样,touch在使用>>重定向之前,您不需要文件。必要时将创建它(但是仅创建文件,而不是整个路径,因此仍然mkdir -p需要)。-p如果目录已经存在,该选项可以使其正常工作。
塔德·里斯比

1
ssh-keyscanGithub文档缺少有关添加新ssh密钥的#2信息。
菲尔·安德鲁斯

1
我在Dockerfile缺乏许可的情况下遇到了问题。在此处添加第二步可以解决该问题!感谢您的出色工作
Spencer Pollock

37

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

应该提示您将github添加到您的已知主机。如果还没有发生,您可以运行ssh -T git@github.com以再次收到提示。


2
如果您从未收到提示,这是正确的答案。
Matthias Hagemann '18

15

对于我来说,我只需要在提示“是否确定要继续连接(是/否)?”的提示下键入“是”即可。而不只是按Enter。


这个答案使我意识到,我必须在构建服务器上手动克隆我的
仓库

1
@Sashah如果您只需要known_hosts中的位桶服务器,则可以手动编辑该文件。如果这是唯一的原因,则无需克隆存储库。
法学徒

7

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

mknod -m 666 /dev/tty c 5 0

1
它对我有用,因为/ dev / tty是作为文件创建的,非常奇怪!(因此您必须删除它,然后使用mknod重新创建它)
2014年

@Geoffroy,我删除了/ dev / tty,现在执行sudo时,我遇到此错误:sudo:对不起,您必须有一个tty才能运行sudo
Milad 2014年

@ xe4me我从未说过您应该删除它,具体取决于实际需要的系统。重新启动应该修复它。
Geoffroy 2014年

@Geoffroy,实际上是第一位评论者,说我必须删除并重新创建:d Nope,重新启动无效,我必须告诉根目录,他已将其修复:d
Milad 2014年

6

如果您在办公室内部网(否则很危险),该内部网始终受防火墙保护,则在〜/ .ssh / config中仅包含以下几行

Host *
StrictHostKeyChecking no
UserKnownHostsFile = / dev / null


2
如果没有公司防火墙,这仍然很危险。您如何知道您在不验证服务器密钥的情况下正在与真实的github对话?
Mnebuerquo

1
在公司环境中,通常使用本地git repos,而不是开源的。最糟糕的情况是,文件顶部的.ssh配置可能具有github明确的主机相关配置行,以便ssh选择更具体的匹配项。
sunil

5

对我有用的是首先添加新计算机的SSH密钥,我按照GitLab的这些说明进行操作-添加SSH密钥。请注意,由于我使用的是Win10,因此必须在Windows的Git Bash中执行所有这些命令(在常规的DOS cmd Shell中不起作用)。

然后再次在Git Bash中,我必须做一个git clone我遇到问题的仓库,在我的情况下,我必须将其克隆为另一个名称,因为我已经在本地拥有它并且不想丢失我的提交。例如

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

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

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

我输入“是”,它终于起作用了,通常应该会收到类似以下的消息:

警告:将“ [您的回购链接]”(ECDSA)永久添加到已知主机列表中。

注意:如果您使用的是Windows,请确保对所有命令都使用Git Bash,但在常规的cmd shell或powershell中均无法使用,我确实必须在Git Bash中执行此操作。

最后,我删除了第二个克隆存储库(myRepo2在示例中),然后回到我的第一个存储库,我终于可以像平常一样在我最喜欢的编辑器VSCode中完成所有Git任务。


确实,我的Cygwin提示看起来几乎与我的git bash提示完全一样,但是它仅在git bash提示中起作用!
Josiah Yoder

3

如果您在Windows上使用git。

  • 打开git GUI。
  • 在git GUI中打开本地git存储库。
  • 添加遥控器或如果遥控器已经存在则推送。
  • 对有关是否要继续的问题回答“是”。

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


2

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

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

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

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


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

再试一次,希望这行得通。


注意:根据您的外壳,可能必须转义方括号\ [和\]或使用引号。
Phlarx

1

当被问到:

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

输入作为响应

这就是我解决问题的方式。但是,如果您尝试仅按Enter键,将无法使用!


0

您可以在Jenkins文件中或任何需要的地方使用“ https” URL格式的“ git url”。

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


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


-1

我遇到了类似的问题,不幸的是,我使用了GitExtensions HMI,却忘记了自己写的密码。使用HMI ....算了!生成密钥时,请勿输入密码!


-4

当我尝试进行git clone非我的回购时,收到了此消息。解决方法是先叉,然后克隆。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.