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

我正在尝试连接到驻留在我的web服务器上的远程Git存储库,并将其克隆到我的机器上。

我使用以下格式的命令:

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

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

主机密钥验证失败。

致命:无法从远程读取 库。< / p >

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

745563 次浏览

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

domain.example的主机键已更改。如果你不觉得这很可疑的话,通过编辑${HOME}/.ssh/known_hosts来删除domain.example的行或让SSH实用程序为你做,从本地缓存中删除旧键

ssh-keygen -R domain.example

从这里开始,您可以自己记录更新后的密钥

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

或者,等效地,让ssh为你做,下次你连接git fetchgit pull,或git push(甚至是一个普通的老ssh domain.example)时,回答是提示时

The authenticity of host 'domain.example (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.example在删除后不再在你的known_hosts中,并且可能不在系统的/etc/ssh/ssh_known_hosts中,所以ssh无法知道连接另一端的主机是否真的是domain.example。(如果错误的密钥在/etc中,具有管理权限的人将不得不更新系统范围内的文件。)

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

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

mknod -m 666 /dev/tty c 5 0

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

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

我有类似的问题,但是,使用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密钥列表。
我也有类似的问题,不幸的是我使用了GitExtensions HMI,忘记了我写了一个密码短语。 与人机界面……算了吧!生成密钥时不输入口令!

你可以在Jenkinsfile或任何你想要的地方使用“https”url格式的“git url”。

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

这意味着您的远程主机密钥被更改(可能是主机密码更改),

您的终端建议以root用户执行该命令

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

您必须从pc/服务器的主机列表中删除该主机名。复制建议的命令并作为根用户执行。

$ 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

再试一次,希望这有用。

如果你在总是由防火墙保护的办公室内部网(否则很危险)中,只需在你的~/.ssh/config中使用以下行。

Host *
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null

对我来说,我只需要在提示“您确定要继续连接(是/否)吗?”时输入“是”,而不是直接按Enter。

这是因为github目前不在你的已知主机。

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

对我有效的是首先添加我的新计算机的SSH密钥,我遵循GitLab -添加SSH密钥中的这些说明。注意,因为我在Win10上,我必须在Windows上的Git Bash中执行所有这些命令(它在常规DOS cmd Shell中不起作用)。

然后再次在Git Bash中,我必须对我有问题的repo做git clone,在我的情况下,我必须将它克隆到一个不同的名称,因为我已经在本地拥有它,不想失去我的提交。例如

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

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

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

我输入了“yes”,它最终工作了,你通常会得到类似这样的消息:

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

请注意:如果你在Windows上,确保你使用Git Bash的所有命令,这在常规cmd shell或powershell中不起作用,我真的不得不在Git Bash中这样做。

最后,我删除了第二个克隆repo (myRepo2在例子中),回到我的第一个repo,我终于可以在我最喜欢的编辑器VSCode中像往常一样做所有Git的东西。

如果你正在使用git for Windows。

  • 打开git GUI。
  • 在git GUI中打开本地git存储库。
  • 添加远程或推送(如果远程已经存在)。
  • 对于你是否想继续的问题,回答“是”。

GUI客户端为你将键添加到~/.ssh/known_hosts。如果你不经常这样做,这更容易记住,也避免了使用git命令行(标准的Windows命令行没有ssh-keyscan可执行文件)。

当我试图git clone一个不是我的回购时,我得到了这条消息。解决办法是先分叉再克隆。

在构建期间,我在DockerFile内部也遇到了同样的错误,而映像是公共的。我在Dockerfile中做了一些修改。

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

这是因为使用git@github.com:…语法最终使用SSH克隆为>,并且在容器中,您的私钥不可用>。你会想要使用RUN git克隆> https://github.com/edenhill/librdkafka.git代替。

当问道:

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

输入是的作为响应

这就是我解决问题的方法。但如果你试着只按回车键,它是行不通的!

当远程服务器想要连接到私有回购时,它将通过ssh进行身份验证。 使用ssh-keygen创建公私密钥对(如果您已经拥有公私密钥)。

. copy&paste public key在private repo的Settings中

YourPrivateRepo -> Settings ->部署密钥->添加部署密钥->粘贴公钥。

现在远程服务器将能够连接到私有回购。

注意:部署键仅具有读取repo的访问权限。需要显式地允许写访问。

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

创建一个名为“config”的文件;在~ /。SSH并添加以下内容

Host github.com
IdentityFile ~/.ssh/github_id_rsa

用你的私钥文件替换github_id_rsa

你可以使用https而不是ssh来克隆git或git pull或git push

例:

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

原因似乎是远程主机的公钥没有存储或与存储的公钥不同。(注意安全问题,详见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命令。
无论如何,你可以通过运行ssh user@host.net.

得到相同的提示符

另一种替代方法也适用于我,而不是克隆SSH链接

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

有一个选项可以选择HTTP链接

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

所以我使用http链接克隆为Visual studio,它为我工作

Tupy的回答的一个小补充,你可能需要添加存储库主机的端口号:

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

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

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

如果你不使用Windows会话来更新代码,并且你使用PortableGit,你需要在运行git命令之前设置HOMEPATH环境变量。

这个例子更适合对于其他用例,但我认为这是一个很好的概念证明这篇文章。

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

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

检查是否有账单问题。 谷歌云停止上传文件到https://source.cloud.google.com/

我得到这个问题消失后支付问题被修复。 但是没有改变键。

谢谢

或者,如果你使用MSYS2终端(在Windows*上)和密码短语,可能是终端没有正确提示“输入密码短语”,从而拒绝访问SSH。

如果你在Windows上,你可以使用Git Bash或Powershell来获得提示并正确连接。(我目前正在寻找MSYS的解决方案。)

*不确定是否相关。

< >强的问题: 主机密钥验证失败。

:无法读取远程存储库

请确保您有正确的访问权限

解决方案:我已经检查了所有的设置,也检查了GitHub中的关键设置。最后,我将Git URL从"git@github.com:palvsv/travelo-moon.git"更改为.config文件"yourprojectdirectory/.git/config"中的"https://github.com/palvsv/travelo-moon.git",它可以工作。

对我来说,我只是重命名“known_hosts"文件到“known_hosts.del"备份。然后重新运行git克隆XXX并键入“yes”。我将创建新的“known_hosts"

还要检查known_hosts文件的权限——包括用户的(~/.ssh/known_hosts)和全局的(/etc/ssh/ssh_known_hosts)。

在我的例子中,旧主机在/etc/ssh/ssh_known_hosts中。当我用sudo ssh-keygen -f /etc/ssh/ssh_known_hosts -R THE_HOST将它作为根删除时,它将该文件的权限更改为0600,因此SSHing到THE_HOST作为根工作,但对于任何其他用户来说,它失败了“主机密钥验证失败”。解决方案是:

sudo chmod 644 /etc/ssh/ssh_known_hosts

只需输入'yes'并按enter,这应该可以工作

< p >仪表盘比;管理Jenkins >配置全局安全>Git主机密钥验证配置。 然后在“主机密钥验证策略”中选择“接受第一个连接”