Git 오류 : 원격 저장소에 연결할 때“호스트 키 확인 실패”


222

웹 서버에있는 원격 Git 리포지토리에 연결하여 내 컴퓨터에 복제하려고합니다.

내 명령에 다음 형식을 사용하고 있습니다.

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

이것은 대부분의 팀원에게 잘 작동했습니다. 일반적 으로이 명령을 실행하면 Git은 사용자의 암호를 묻는 메시지를 표시 한 다음 복제를 실행합니다. 그러나 내 컴퓨터 중 하나에서 실행할 때 다음 오류가 발생합니다.

호스트 키 확인에 실패했습니다.

치명적 : 원격 저장소에서 읽을 수 없습니다.

우리는 SSH 키를 사용 하여이 저장소에 연결하지 않으므로 Git이 왜이 특정 컴퓨터에서 하나를 확인하는지 모르겠습니다.


1
당신이 하는 이 저장소에 연결하기 위해 SSH를 사용하여, 통지는 URL로 시작하는 방법ssh://
브랜든

나는이 비슷한 문제 . 아무도 나를 도울 수 있습니까? 나는 붙어있다 :(
SepSol

답변:


164

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 fetch, git pull또는 git push(또는 일반 팔자 ' ssh domain.com메시지가 표시되면 예를 응답에 의해)을

호스트 'domain.com (abcd)'의 신뢰성을 설정할 수 없습니다.
RSA 키 지문은 XX : XX : ... : XX입니다.
계속 연결 하시겠습니까 (예 / 아니요)?

이 프롬프트의 이유는 known_hosts삭제 후 domain.com이 더 이상 사용자 의 시스템에없고 아마도 시스템에 없는 /etc/ssh/ssh_known_hosts것이므로 ssh연결의 다른 쪽 끝에있는 호스트가 실제로 domain.com인지 알 수있는 방법이 없습니다. (에 잘못된 키가 있으면 /etc관리자 권한을 가진 사람이 시스템 전체 파일을 업데이트해야합니다.)

사용자가 키를 사용하여 인증하도록하는 것이 좋습니다. 이렇게하면 ssh-agent모든 사람이 서버에 연결할 때마다 암호를 입력하지 않고 편의를 위해 주요 자료를 저장할 수 있으며 암호는 네트워크를 통과하지 않습니다.


3
재미있는 사실은 running으로 sudo ssh-keygen -R domain.com기존 known_hosts파일의 이름을로 바꾸고 root로만 읽을known_hosts.old 수있는 사본 만들 수 있습니다 . ( -rw------- root root) chown이것을 적절한 사용자에게 쉽게 되돌릴 수 있지만 오후에 왜 git이 깨지는 지 디버깅하는 데 낭비가 될 수 있습니다. : D
Andrew Rueckert

1
Are you sure you want to continue connecting (yes/no)?. 저와 같은 실수를하지 마십시오. 을 입력해야합니다 yes. Enter
키만 누르면

306

이전에 git repo 복제 에서 응답 했으므로 오류가 발생합니다-호스트 키 확인에 실패했습니다. 치명적 : 원격 끝이 예기치 않게 끊어졌습니다 . 승인 된 호스트 목록에 GitHub를 추가하십시오.

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


3
이것은 이미 중요한 선물을 가지고 있지 않은 가장 안전한 방법입니다. 서버에 연결할 때마다가 아니라 한 번만 실행한다고 가정합니다.
Zenexer

내 회사의 개인 맞춤 저장소는 ecdsa를 키로 사용하므로 솔루션이 작동하지 않으면 알고리즘이 올바르지 않기 때문일 수 있습니다.
Fendy

8
이것이 정답입니다. 하루를 구 해주셔서 감사합니다.
Keyur

저도 저를 위해 일했습니다. 왜 내 자신의 레포를 복제 할 수 없는지 궁금했습니다.
StackAttack

누군가이 게시물을 잘못 표시했습니다. 검토에서 .
Wai Ha Lee

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명령은 경우에 실패 ~/.ssh1 단계는 여전히 필요 그래서, 존재하지 않는 디렉토리. 또한 리디렉션 touch을 사용하기 전에 파일을 사용할 필요가 없습니다 >>. 필요한 경우 생성되지만 전체 경로가 아닌 파일 만 mkdir -p필요 하므로 여전히 필요합니다. 이 -p옵션은 디렉토리가 이미 존재하는 경우 작동합니다.
Tad Lispy 2012 년

1
ssh-keyscan새 ssh 키를 추가 할 때 Github 문서에서 누락 된 것은 2 위 입니다.
Phil Andrews

1
Dockerfile권한이없는 데 문제가있었습니다 . 여기에 2 단계를 추가하면 문제가 해결되었습니다! 위대한 연구에 감사드립니다
Spencer Pollock

37

github이 현재 알려진 호스트에 없기 때문에 발생합니다.

알려진 호스트에 github을 추가하라는 메시지가 나타납니다. 이 문제가 발생하지 않으면 ssh -T git@github.com메시지가 다시 표시 되도록 실행할 수 있습니다 .


2
프롬프트가 표시되지 않는 경우 정답입니다.
Matthias Hagemann

15

나를 위해 프롬프트에 "yes"를 입력하면 "계속 하시겠습니까?"라는 메시지가 나타납니다. Enter 키를 누르기보다는


이 답변을 통해 'yes'를 입력하고 bitbucket 서버를 known_hosts에 추가하기 위해 빌드 서버에서
리포지를

1
@Sashah known_knowns의 bitbucket 서버 만 있으면 파일을 수동으로 편집 할 수 있습니다. 이것이 유일한 이유라면 리포지토리를 복제 할 필요가 없습니다.
코드 견습생

7

새로 설치된 시스템에서 같은 문제가 발생했지만 이것은 udev 문제였습니다. /dev/tty노드 가 없으므로 수행해야했습니다.

mknod -m 666 /dev/tty c 5 0

1
/ dev / tty가 파일로 만들어 졌기 때문에 매우 효과적이었습니다! (따라서 제거하고 mknod로 다시 작성해야 함)
Doomsday

@Geoffroy, 나는 / dev / tty를 제거하고 지금 sudo를 할 때, 나는이 오류에 직면한다 : sudo : 죄송합니다, sudo를 실행하려면 tty가 있어야합니다
Milad

@ xe4me 실제로 필요한 시스템에 따라 제거해야한다고 말한 적이 없습니다. 재부팅하면 문제가 해결됩니다.
Geoffroy

실제로 첫 번째 해설자 인 @Geoffroy는 제거하고 다시 만들어야한다고 말했다 : d Nope, 재부팅이 작동하지 않았다. 나는 루트를 말해야했다.
밀라 드

6

항상 방화벽으로 보호되는 사무실 인트라넷 (그렇지 않으면 위험한)에 있다면 ~ / .ssh / config에 다음 줄이 있습니다.

호스트 *
StrictHostKeyUserKnownHosts 파일을 확인하지
않음


2
회사 방화벽이 없으면 여전히 위험합니다. 서버 키를 확인하지 않고 실제 github과 대화하고 있다는 것을 어떻게 알 수 있습니까?
Mnebuerquo

1
회사 환경에서는 로컬 git repos가 주로 사용되며 오픈 소스를 사용하지 마십시오. 파일 상단의 최악의 경우 .ssh 구성에는 ssh가 더 구체적인 일치 항목을 선택하도록 github 명시 적 호스트 관련 구성 줄이있을 수 있습니다.
선일

5

나를 위해 일한 것은 먼저 새 컴퓨터의 SSH 키를 추가하는 것이 었습니다 .GitLab-add SSH 키의 지침을 따랐습니다 . Win10을 사용하고 있으므로 Windows의 Git Bash에서 이러한 모든 명령을 수행해야합니다 (일반 DOS cmd 셸에서는 작동하지 않음).

그런 다음 다시 Git Bash에서 git clone문제가있는 리포지토리 를 수행해야 했으며, 이미 로컬에 있었고 커밋을 잃고 싶지 않기 때문에 다른 이름으로 복제해야했습니다. 예를 들어

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

그런 다음 알려진 호스트 목록에 추가하라는 메시지가 표시됩니다. 질문은 다음과 같습니다.

계속 연결 하시겠습니까 (예 / 아니요)?

"yes"라고 입력하고 마침내 작동했습니다. 일반적으로 다음과 유사한 메시지가 나타납니다.

경고 : 알려진 호스트 목록에 '[your repo link]'(ECDSA)를 영구적으로 추가했습니다.

노트 : Windows를 사용하는 경우 모든 명령에 Git Bash를 사용하는지 확인하십시오. 일반 cmd 쉘 또는 powershell에서는 작동하지 않습니다 .Git Bash에서 실제로이 작업을 수행해야했습니다.

마지막으로 두 번째 복제 저장소 ( myRepo2예제)를 삭제하고 첫 번째 저장소로 돌아가서 마지막으로 좋아하는 편집기 VSCode에서 모든 Git 작업을 정상적으로 수행 할 수있었습니다.


실제로 Cygwin 프롬프트는 내 git bash 프롬프트와 거의 동일하지만 git bash 프롬프트에서만 작동합니다!
Josiah Yoder

3

Windows 용 git을 사용하는 경우

  • 자식 GUI를 엽니 다.
  • 자식 GUI에서 로컬 자식 저장소를 엽니 다.
  • 리모컨을 추가하거나 리모컨이 이미 있으면 밀어 넣으십시오.
  • 계속할 것인지에 대한 질문에 "예"라고 대답하십시오.

GUI 클라이언트가 키를 추가합니다 ~/.ssh/known_hosts. 자주하지 않으면 기억하기가 쉽고 git 명령 줄을 사용할 필요가 없습니다 (표준 Windows 명령 줄에는 ssh-keyscan실행 파일 이 없습니다) .


2

원격 서버가 개인 저장소에 연결하려고하면 ssh를 통해 인증됩니다. ssh-keygen을 사용하거나 이미 공개-개인 키가있는 개인-공개 키 쌍을 작성하십시오. 개인 저장소 설정에서 공개 키를 복사하여 붙여 넣습니다.

YourPrivateRepo-> 설정-> 배포 키-> 배포 키 추가-> 공개 키 붙여 넣기

이제 원격 서버는 개인 저장소에 연결할 수 있습니다.

참고 : 배포 키는 저장소를 읽기위한 액세스 권한 만 갖습니다. 쓰기 액세스를 명시 적으로 허용해야합니다.


1

원격 호스트 키가 변경되었음을 의미합니다 (호스트 비밀번호 변경 일 수 있음).

터미널은이 명령을 루트 사용자로 실행하도록 제안했습니다

$ 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

다시 시도하십시오, 이것이 효과가 있기를 바랍니다.


참고 : 쉘에 따라 대괄호 \ [및 \]를 이스케이프하거나 따옴표를 사용해야 할 수도 있습니다.
Phlarx

1

물었을 때 :

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

응답으로 yes 를 입력 하십시오.

이것이 내가 문제를 해결 한 방법입니다. 그러나 Enter 버튼을 누르려고하면 작동하지 않습니다!


0

Jenkinsfile 또는 원하는 곳에서 '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아닌 레포를 시도했을 때이 메시지를 받았습니다 . 수정은 포크 한 다음 복제하는 것이 었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.