Git 错误:连接到远程存储库时"Host Key Verification Failed"



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

我为我的命令使用以下格式:

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

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

主机密钥验证失败。

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

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

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

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

您正在通过 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

或者,等效地,下次您连接git fetchgit pullgit push(甚至是普通的ssh domain.example)时,让ssh为您执行此操作,并在出现提示时回答"是

"
无法确定主机"域示例(a.b.c.d)"的真实性。 RSA 密钥指纹是 XX:XX:...:XX。 是否确实要继续连接(是/否)?

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

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

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

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

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

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

当终端显示:

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

不要我重复不要直接按Enter.

您必须先在终端中键入yes,然后按Enter

如果您在始终受防火墙保护的办公室内联网(否则很危险)中,只需在您的~/.ssh/config中具有以下行即可。

Host *
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null

当被问到:

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

键入yes作为响应

这就是我解决问题的方式。但是,如果您尝试只按回车按钮,它将不起作用!

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

mknod -m 666 /dev/tty c 5 0

对我有用的是首先添加新计算机的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工作。

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

您的私有存储库 -> 设置 -> 部署密钥 -> 添加部署密钥 -> 粘贴公钥。

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

注意:部署密钥仅具有读取存储库的访问权限。需要显式允许写入访问。

如果你使用的是 git for Windows。

  • 打开 git 图形用户界面。
  • 在 git GUI 中打开本地 git 存储库。
  • 添加远程或推送(如果远程已存在)。
  • 对有关是否要继续的问题回答"是"。

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

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

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

Host github.com
IdentityFile ~/.ssh/github_id_rsa

github_id_rsa替换为您的私钥文件。

您可以在 Jenkinsfile 或任何您想要的地方使用"https"URL 格式的"git url"。

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

在映像公开的构建过程中,我在 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。

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

前任:

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

检查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将其作为 root 删除时,它将该文件的权限更改为 0600,因此 SSH 以 root 身份THE_HOST有效,但对于任何其他用户,它因"主机密钥验证失败"而失败。修复是:

sudo chmod 644 /etc/ssh/ssh_known_hosts

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...

仪表板>管理 Jenkins>配置全局安全性> 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

再试一次,希望这有效。

原因似乎是远程主机的公钥未存储或与存储的公钥不同。(请注意安全问题,有关详细信息,请参阅格雷格·培根的回答。

在这种情况下,我习惯于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 工作室,它对我有用

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

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

$env:HOMEPATH="UsersAdministrator";C:pathtoPortableGitbingit.exe -C C:pathtorepository.git pull'

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

检查是否存在计费问题。 谷歌云停止将文件上传到 https://source.cloud.google.com/

付款问题解决后,我得到了这个问题。 但没有更改密钥。

谢谢

我刚刚清除了我已知的主机文件,这似乎可以解决问题。

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

如果您使用的是Windows,则可以使用Git Bash或Powershell来获取提示并正确连接。(我目前正在寻找 MSY 的解决方案。

*不确定是否相关。

问题:主机密钥验证失败。 致命:无法从远程存储库读取。

请确保您拥有正确的访问权限 并且存储库存在。

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

对于新手,在执行上述操作之前,您需要使用以下命令登录 Jenkins:

sudo su - jenkins

这对我有用。

对我来说,我只是将"known_hosts"文件重命名为"known_hosts.del"进行备份。 然后重新运行 Git 克隆 xxx 并键入"是"。我将创建新的"known_hosts">

只需键入'yes'并按回车键,这应该可以工作

相关内容

最新更新