簡體   English   中英

Git 錯誤:連接到遠程存儲庫時出現“主機密鑰驗證失敗”

[英]Git error: "Host Key Verification Failed" when connecting to remote repository

我正在嘗試連接到駐留在我的 web 服務器上的遠程 Git 存儲庫,並將其克隆到我的機器上。

我的命令使用以下格式:

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

這對我的大多數團隊成員來說都很好。 通常運行此命令后 Git 會提示輸入用戶密碼,然后運行克隆。 但是,在我的其中一台機器上運行時出現以下錯誤:

主機密鑰驗證失敗。

致命:無法從遠程存儲庫讀取。

我們沒有使用 SSH 密鑰連接到這個存儲庫,所以我不確定為什么 Git 正在檢查這台特定機器上的密鑰。

正如我之前在克隆 git repo 中回答的那樣導致錯誤 - 主機密鑰驗證失敗。 致命:遠程端意外掛斷,將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

或者,等價地,讓ssh在您下次連接git fetchgit pullgit push (甚至是普通的 ol' ssh domain.example )時為您執行此操作,方法是在提示時回答 yes

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可以方便地存儲密鑰材料(而不是每個人都必須在每次連接到服務器時輸入她的密碼),並且密碼不會通過網絡傳輸。

我有類似的問題,但是,使用 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。

如果您在始終受防火牆保護的辦公室內部網(否則很危險)中,只需在您的~/.ssh/config中添加以下行。

Host *
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null

我在新安裝的系統上遇到了同樣的問題,但這是一個 udev 問題。 沒有/dev/tty節點,所以我必須這樣做:

mknod -m 666 /dev/tty c 5 0

當被問及:

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

鍵入yes作為響應

這就是我解決問題的方法。 但是,如果您嘗試僅按 Enter 按鈕,它將無法正常工作!

對我有用的是首先添加我的新計算機的 SSH 密鑰,我按照GitLab 的這些說明進行操作 - 添加 SSH 密鑰 請注意,由於我使用的是 Win10,因此我必須在 Windows 上的 Git Bash 中執行所有這些命令(它在常規 DOS cmd Shell 中不起作用)。

然后再次在 Git Bash 中,我必須對我遇到問題的 repo 進行git clone ,在我的情況下,我必須將它克隆為不同的名稱,因為我已經在本地擁有它並且不想丟失我的提交. 例如

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

然后我得到提示將其添加到已知主機列表中,問題可能是這個:

您確定要繼續連接(是/否)?

我輸入了“yes”,它終於成功了,你通常會收到類似這樣的消息:

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

注意:如果您在 Windows 上,請確保對所有命令都使用 Git Bash,這在常規 cmd shell 或 powershell 中不起作用,我真的必須在 Git Bash 中執行此操作。

最后,我刪除了第二個克隆存儲庫(示例中為myRepo2 )並返回到我的第一個存儲庫,我終於可以在我最喜歡的編輯器 VSCode 中像平常一樣完成所有 Git 工作。

當遠程服務器想要連接到私有倉庫時,它將通過 ssh 進行身份驗證。 使用 ssh-keygen 創建私鑰-公鑰對,或者如果您已經擁有公鑰-私鑰。 在私有倉庫的設置中復制並粘貼公鑰。

YourPrivateRepo -> 設置 -> 部署密鑰 -> 添加部署密鑰 -> 粘貼公鑰。

現在遠程服務器將能夠連接到私有倉庫。

注意:部署密鑰只能讀取 repo。 需要明確允許寫訪問。

如果你在 Windows 上使用 git。

  • 打開 git GUI。
  • 在 git GUI 中打開本地 git 存儲庫。
  • 如果遙控器已經存在,則添加遙控器或推送。
  • 對是否要繼續的問題回答“是”。

GUI 客戶端將您的密鑰添加到~/.ssh/known_hosts 如果您不經常這樣做,這更容易記住,並且還避免了使用 git 命令行的需要(標准的 Windows 命令行沒有ssh-keyscan可執行文件。

這里提到的解決方案很棒,唯一缺少的一點是,如果您的公鑰和私鑰文件名與默認文件名不同怎么辦?

在 ~/.ssh 下創建一個名為“config”的文件並添加以下內容

Host github.com
    IdentityFile ~/.ssh/github_id_rsa

github_id_rsa替換為您的私鑰文件。

在圖像公開時,我在構建期間在 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代替。

檢查 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,因此以 root 身份 SSH 到 THE_HOST 可以工作,但對於任何其他用戶,它以“主機密鑰”失敗驗證失敗”。 解決方法是:

sudo chmod 644 /etc/ssh/ssh_known_hosts

這意味着您的遠程主機密鑰已更改(可能是主機密碼更改),

您的終端建議以 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

再試一次,希望這有效。

您可以使用 https 而不是 ssh 進行 git clone 或 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 Session 來更新代碼,並且您使用PortableGit ,則需要在運行 git 命令之前設置HOMEPATH環境變量。

這個例子更適合其他用例,但我認為這對這篇文章來說是一個很好的概念證明。

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

推送到 Git 返回錯誤代碼 403 致命:HTTP 請求失敗

檢查是否存在計費問題。 Google Cloud 停止將文件上傳到https://source.cloud.google.com/

付款問題解決后,我得到了這個問題。 但沒有改變鑰匙。

謝謝

我剛剛清除了我已知的主機文件,這似乎可以解決問題。

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

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

或者,如果您使用的是MSYS2終端(在 Windows* 上)和密碼,則可能是終端沒有正確提示“輸入密碼”,從而拒絕訪問 SSH。

如果您使用的是 Windows,則可以改為使用 Git Bash 或 Powershell 來獲取提示並正確連接。 (我目前正在尋找 MSYS 的解決方案。)

*不確定是否相關。

問題:主機密鑰驗證失敗。 致命:無法從遠程存儲庫中讀取。

請確保您具有正確的訪問權限並且存儲庫存在。

解決方案:我檢查了所有設置,還檢查了 GitHub 中的關鍵設置。 最后,我在.config文件"yourprojectdirectory/.git/config" Git URL 從"git@github.com:palvsv/travelo-moon.git"更改為"https://github.com/palvsv/travelo-moon.git" "yourprojectdirectory/.git/config" ,它的工作原理。

對我來說,我只是將“known_hosts”文件重命名為“known_hosts.del”進行備份。 然后重新運行 git clone xxx 並輸入“yes”。 我將創建新的“known_hosts”

只需輸入'yes'並按回車即可

儀表板 > 管理 Jenkins > 配置全局安全 > Git 主機密鑰驗證配置。 然后在 Host Key Verification Strategy select 中接受第一個連接。

刪除 package-lock.json 或 yarn.lock 然后重試

當終端顯示:

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

不要我重復不要直接按Enter

必須先在終端輸入yes ,然后按Enter

對於新手,在執行上述操作之前,您需要使用以下命令登錄 Jenkins:

sudo su - jenkins

這對我有用。

我遇到了類似的問題,不幸的是我使用了 GitExtensions HMI 並忘記了我寫了一個密碼。 使用 HMI.... 算了吧! 生成密鑰時不要輸入密碼!

當我嘗試git clone一個不屬於我的倉庫時,我收到了這條消息。 解決方法是分叉然后克隆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM