【问题标题】:Git error: "Host Key Verification Failed" when connecting to remote repositoryGit错误:连接到远程存储库时“主机密钥验证失败”
【发布时间】:2012-11-02 01:08:48
【问题描述】:

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

我的命令使用以下格式:

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

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

主机密钥验证失败。

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

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

【问题讨论】:

  • 正在使用 SSH 连接到此存储库,请注意您的 URL 是如何以 ssh:// 开头的

标签: git ssh ssh-keys


【解决方案1】:

正如我之前在 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

【讨论】:

  • 这是最安全的方式,除了已经存在密钥。这是假设您只运行一次,而不是每次连接到服务器时。
  • 我公司的私有 fit 仓库使用 ecdsa 作为 key,所以如果解决方案不起作用,可能是算法不正确
  • 这应该是公认的答案。谢谢你拯救了我的一天。
  • 如果您使用的是 Windows,最简单的方法是安装 git-for-windows(下载)并打开 Git Bash 。在此控制台中,您可以使用 ssh-keyscan 命令
  • 您不知道您的回答可以挽救多少年的挫败感。它还修复了 github 桌面的身份验证错误。我的流感也需要试试 XD
【解决方案2】:

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

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

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

【讨论】:

  • 我也必须这样做,谢谢!
【解决方案3】:

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

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

*不确定是否相关。

【讨论】:

    【解决方案4】:

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

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

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

    谢谢

    【讨论】:

      【解决方案5】:

      如果你没有使用 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'

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

          有一个选择http链接的选项

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

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

          【讨论】:

            【解决方案8】:

            如果您位于始终受防火墙保护的办公室内部网(否则很危险),只需在您的~/.ssh/config 中添加以下行。

            Host *
              StrictHostKeyChecking no
              UserKnownHostsFile=/dev/null
            

            【讨论】:

            • 这仍然很危险,因为我们没有企业防火墙。你怎么知道你在和真正的 github 对话而不验证服务器密钥?
            • 在企业环境中,主要使用本地 git 存储库,从不开源。文件顶部的最坏情况 .ssh 配置可以具有 github 显式与主机相关的配置行,以便 ssh 选择更具体的匹配项。
            【解决方案9】:

            原因似乎是远程主机的公钥未存储或与存储的不同。 (请注意安全问题,有关详细信息,请参阅 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得到同样的提示。

            【讨论】:

              【解决方案10】:

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

              例如:

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

              【讨论】:

                【解决方案11】:

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

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

                Host github.com
                    IdentityFile ~/.ssh/github_id_rsa
                

                用你的私钥文件替换github_id_rsa

                【讨论】:

                  【解决方案12】:

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

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

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

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

                  【讨论】:

                    【解决方案13】:

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

                    【讨论】:

                    • @OJFord 仅供参考:我已经编辑了原始答案,使您的评论过时了。 TBH,恕我直言,它一开始并不完全正确。如果~/.ssh 目录不存在,touch 命令将失败,因此仍然需要步骤 1。在使用>> 重定向之前,您也不需要touch 文件。如有必要,将创建它(但只是文件,而不是整个路径,所以仍然需要mkdir -p)。 -p 选项使其在目录已经存在的情况下工作。
                    • 这是#2 ssh-keyscan,Github 文档中关于添加新 ssh 密钥的内容缺失。
                    • 我的Dockerfile 缺少权限时遇到问题。在此处添加第二步解决了该问题!感谢您的出色工作
                    • 我按照上述步骤失败了,因为我将 github.com 作为 spring 配置服务器属性文件中的 hostKey。那些无法连接 spring.cloud.config-server 以从 git 获取的人,请参阅tranhoangminh.wordpress.com/2018/09/14/…。这里解释得很好。
                    【解决方案14】:

                    您正在通过 SSH 协议进行连接,如克隆 URL 上的 ssh:// 前缀所示。使用 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 为您做这件事,下次您与git fetchgit pullgit push(甚至是普通的ssh domain.com)联系时,在提示时回答“是”

                    无法确定主机“domain.com (a.b.c.d)”的真实性。
                    RSA 密钥指纹为 XX:XX:...:XX。
                    确定要继续连接(是/否)?

                    出现这个提示的原因是domain.com删除后不再在你的known_hosts中,估计不在系统的/etc/ssh/ssh_known_hosts中,所以ssh无法知道另一端的主机是否连接实际上是 domain.com。 (如果 /etc 中的密钥有误,则必须由具有管理权限的人更新系统范围的文件。)

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

                    【讨论】:

                    • 有趣的是,运行sudo ssh-keygen -R domain.com 可以将现有的known_hosts 文件重命名为known_hosts.old,并创建一个只能由root 读取的副本。 (-rw------- root root) 你可以很容易地将chown 回复给相应的用户,但你也可能会浪费一个下午的时间来调试 git 损坏的原因。 :D
                    • Are you sure you want to continue connecting (yes/no)?。不要和我犯同样的错误。您需要输入yes。默认情况下,只需按 Enter 键不会选择是
                    • 对于 CI 环境,如 Jenkins,在提示时您不能回答是。因此,请确保: 1. 您已正确创建了 ssh 密钥并在您家中的 .ssh 目录中。 2. 目标域添加到 known_hosts 如此处所述。
                    • 一个问题是您可能需要远程存储库的端口号:ssh-keyscan -p 8888 -t rsa domain.com >> ~/.ssh/known_hosts
                    • @AndrewRueckert 将sudo 随机添加到命令开头是一个坏主意的众多原因之一。
                    【解决方案15】:

                    当被问到时:

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

                    输入 yes 作为响应

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

                    【讨论】:

                      【解决方案16】:

                      在构建时,我在 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 代替。

                      【讨论】:

                        【解决方案17】:

                        这是因为 github 当前不在您的已知主机中。

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

                        【讨论】:

                        • 如果您从未收到提示,这就是正确答案。
                        【解决方案18】:

                        当我尝试 git clone 一个不属于我的存储库时,我收到了这条消息。解决方法是分叉然后克隆。

                        【讨论】:

                          【解决方案19】:

                          如果你在 Windows 上使用 git。

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

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

                          【讨论】:

                            【解决方案20】:

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

                            然后再次在 Git Bash 中,我必须对我遇到问题的 repo 执行 git clone,在我的情况下,我不得不将它克隆为不同的名称,因为我已经在本地拥有它并且不想要失去我的承诺。例如

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

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

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

                            我输入了“是”,它终于成功了,您通常应该会收到类似这样的消息:

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

                            注意:如果您在 Windows 上,请确保对所有命令都使用 Git Bash,这在常规 cmd shell 或 powershell 中不起作用,我真的必须在 Git Bash 中执行此操作.

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

                            【讨论】:

                            • 确实,我的 Cygwin 提示符看起来几乎与我的 git bash 提示符一模一样,但它只适用于 git bash 提示符!
                            【解决方案21】:

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

                            【讨论】:

                            • 这个答案让我意识到我必须在构建服务器上手动克隆我的仓库才能输入“是”并将我的 bitbucket 服务器添加到我的 known_hosts
                            • @Sashah 如果您只需要 known_hosts 中的 bitbucket 服务器,您可以手动编辑该文件。如果这是唯一的原因,则无需克隆 repo。
                            【解决方案22】:

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

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

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

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

                            再试一次,希望能成功。

                            【讨论】:

                            • 注意:根据您的外壳,您可能需要转义方括号 \[ 和 \] 或使用引号。
                            【解决方案23】:

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

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

                            【讨论】:

                              【解决方案24】:

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

                              【讨论】:

                                【解决方案25】:

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

                                mknod -m 666 /dev/tty c 5 0
                                

                                【讨论】:

                                • 它对我有用,因为 /dev/tty 是作为文件创建的,很奇怪! (所以你必须删除它然后用 mknod 重新创建它)
                                • @Geoffroy ,我删除了 /dev/tty ,现在在执行 sudo 时,我遇到了这个错误:sudo: 抱歉,你必须有一个 tty 才能运行 sudo
                                • @xe4me 我从来没有说过你应该删除它,这取决于它实际需要的系统。重新启动应该可以解决它。
                                • @Geoffroy,实际上是第一位评论员,说我必须删除并重新创建:d 不,重新启动不起作用,我不得不告诉 root,他修复了它:d
                                猜你喜欢
                                • 1970-01-01
                                • 2020-07-15
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多