ข้อผิดพลาดของ Git:“ การตรวจสอบความถูกต้องของโฮสต์ไม่สำเร็จ” เมื่อเชื่อมต่อกับที่เก็บข้อมูลระยะไกล


222

ฉันกำลังพยายามเชื่อมต่อกับที่เก็บ Git ระยะไกลที่อยู่บนเว็บเซิร์ฟเวอร์ของฉันและโคลนไปยังเครื่องของฉัน

ฉันใช้รูปแบบต่อไปนี้สำหรับคำสั่งของฉัน:

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

สิ่งนี้ได้ผลดีสำหรับสมาชิกในทีมของฉัน โดยปกติหลังจากรันคำสั่งนี้ Git จะถามรหัสผ่านของผู้ใช้แล้วเรียกใช้การโคลน อย่างไรก็ตามเมื่อทำงานกับหนึ่งในเครื่องของฉันฉันได้รับข้อผิดพลาดต่อไปนี้:

การยืนยันคีย์โฮสต์ล้มเหลว

ร้ายแรง: ไม่สามารถอ่านจากที่เก็บระยะไกล

เราไม่ได้ใช้กุญแจ SSH เพื่อเชื่อมต่อกับพื้นที่เก็บข้อมูลนี้ดังนั้นฉันไม่แน่ใจว่าทำไม Git ถึงตรวจสอบรหัสบนเครื่องนี้


1
คุณกำลังใช้ SSH เพื่อเชื่อมต่อกับพื้นที่เก็บข้อมูลนี้สังเกตว่า URL ของคุณเริ่มต้นอย่างไรssh://
Brandon

ฉันมีปัญหาที่คล้ายกัน ใครช่วยฉันได้บ้าง ฉันติดอยู่ :(
SepSol

คำตอบ:


164

คุณกำลังเชื่อมต่อผ่านโปรโตคอล SSH ตามที่ระบุไว้โดยssh://คำนำหน้าใน URL โคลนของคุณ ใช้ 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
คุณแน่ใจหรือไม่ว่าต้องการเชื่อมต่อ (ใช่ / ไม่ใช่)

สาเหตุของการแจ้งเตือนนี้คือ domain.com ไม่ได้อยู่ในคุณอีกต่อไปknown_hostsหลังจากลบและไม่ได้อยู่ในระบบ/etc/ssh/ssh_known_hostsดังนั้นจึงsshไม่มีทางรู้ได้ว่าโฮสต์ที่ปลายอีกด้านหนึ่งของการเชื่อมต่อนั้นเป็น domain.com จริงๆหรือไม่ (หากคีย์ผิดอยู่/etcคนที่มีสิทธิ์ระดับผู้ดูแลระบบจะต้องอัปเดตไฟล์ทั่วทั้งระบบ)

ฉันขอแนะนำให้คุณพิจารณาให้ผู้ใช้รับรองความถูกต้องด้วยรหัสเช่นกัน ด้วยวิธีนี้ssh-agentสามารถจัดเก็บวัสดุสำคัญเพื่อความสะดวกสบาย (แทนที่จะทุกคนต้องป้อนรหัสผ่านของเธอสำหรับการเชื่อมต่อแต่ละครั้งไปยังเซิร์ฟเวอร์) และรหัสผ่านไม่ผ่านเครือข่าย


3
ความเป็นจริงสนุก, การทำงานsudo ssh-keygen -R domain.comสามารถเปลี่ยนชื่อที่มีอยู่known_hostsไฟล์จะเป็นknown_hosts.oldและสร้างสำเนาที่สามารถอ่านได้เท่านั้นโดยราก ( -rw------- root root) คุณสามารถchownย้อนกลับไปยังผู้ใช้ที่เหมาะสมได้อย่างง่ายดายแต่คุณอาจเสียเวลาแก้จุดบกพร่องในช่วงบ่ายเพราะเหตุใด git จึงเสียหาย : D
Andrew Rueckert

1
Are you sure you want to continue connecting (yes/no)?. อย่าทำผิดแบบเดียวกับฉัน yesคุณจำเป็นต้องพิมพ์ เพียงกดปุ่ม Enter ไม่ได้เลือกใช่ตามค่าเริ่มต้น
JolonB

306

ตามที่ฉันตอบก่อนหน้านี้ในการโคลน repo git ทำให้เกิดข้อผิดพลาด - การยืนยันคีย์โฮสต์ล้มเหลว ร้ายแรง: สิ้นสุดระยะไกลวางสายโดยไม่คาดคิดเพิ่ม GitHub ลงในรายการโฮสต์ที่ได้รับอนุญาต:

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


3
นี่เป็นวิธีที่ปลอดภัยที่สุดซึ่งขาดการมีกุญแจอยู่แล้ว นั่นคือสมมติว่าคุณรันครั้งเดียวไม่ใช่ทุกครั้งที่คุณเชื่อมต่อกับเซิร์ฟเวอร์
Zenexer

พื้นที่เก็บข้อมูลส่วนตัวพอดีของ บริษัท ของฉันคือการใช้ ECDSA เป็นกุญแจสำคัญดังนั้นหากแก้ปัญหาไม่ได้ทำงานบางทีมันอาจจะเป็นเพราะขั้นตอนวิธีการไม่ถูกต้อง
Fendy

8
นี่ควรเป็นคำตอบที่ยอมรับได้ ขอบคุณสำหรับการบันทึกวันของฉัน
Keyur

ทำงานให้ฉันด้วยฉันก็สงสัยว่าทำไมฉันไม่สามารถลอกแบบ repo ของตัวเองได้
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ไปยังรายการคีย์ SSH ในโปรไฟล์ GitHub ของคุณ

1
@OJFord FYI: ฉันได้แก้ไขคำตอบเดิมในแบบที่ทำให้ความคิดเห็นของคุณล้าสมัย TBH และด้วยความเคารพเนื่องจากมันไม่ถูกต้องทั้งหมดตั้งแต่แรก touchคำสั่งจะล้มเหลวในกรณี~/.sshไดเรกทอรีไม่อยู่ดังนั้นขั้นตอนที่ 1 ก็ยังคงจำเป็นต้องใช้ นอกจากนี้คุณไม่จำเป็นต้องtouchใช้ไฟล์ก่อนใช้การ>>เปลี่ยนเส้นทาง มันจะถูกสร้างขึ้นหากจำเป็น (แต่เป็นเพียงไฟล์ไม่ใช่พา ธ ทั้งหมดดังนั้นจึงmkdir -pจำเป็นต้องใช้) -pตัวเลือกที่จะทำให้การทำงานในกรณีที่ไดเรกทอรีที่มีอยู่แล้ว
ตาด Lispy

1
เป็น # 2 ssh-keyscanที่ขาดหายไปจากเอกสาร Github ในการเพิ่มคีย์ ssh ใหม่
Phil Andrews

1
ฉันมีปัญหากับการที่ฉันDockerfileไม่ได้รับอนุญาต การเพิ่มขั้นตอนที่ 2 ที่นี่แก้ไขปัญหานั้นได้! ขอบคุณสำหรับการทำงานที่ยอดเยี่ยม
Spencer Pollock

37

สิ่งนี้เกิดขึ้นเพราะ GitHub ไม่ได้อยู่ในโฮสต์ที่คุณรู้จัก

คุณควรได้รับแจ้งให้เพิ่ม github ให้กับโฮสต์ที่คุณรู้จัก หากสิ่งนี้ไม่เกิดขึ้นคุณสามารถเรียกใช้ssh -T git@github.comเพื่อรับพรอมต์อีกครั้ง


2
นี่คือคำตอบที่ถูกต้องหากคุณไม่เคยได้รับแจ้ง
Matthias Hagemann

15

สำหรับฉันฉันต้องพิมพ์ "ใช่" ที่พรอมต์ซึ่งถามว่า "คุณแน่ใจหรือว่าต้องการเชื่อมต่อต่อ (ใช่ / ไม่ใช่)" มากกว่าแค่กด Enter


คำตอบนี้ทำให้ฉันรู้ว่าฉันต้องโคลน repo ของฉันด้วยตนเองบนเซิร์ฟเวอร์ build ของฉันเพื่อพิมพ์ 'ใช่' และเพิ่มเซิร์ฟเวอร์ bitbucket ของฉันไปที่ known_hosts ของฉัน
Sashah

1
@Sashah หากทั้งหมดที่คุณต้องการคือเซิร์ฟเวอร์ bitbucket ใน known_hosts คุณสามารถแก้ไขไฟล์ได้ด้วยตนเอง ไม่จำเป็นต้องลอกแบบ repo หากนี่เป็นเพียงเหตุผลเดียวที่ทำเช่นนั้น
Code-Apprentice

7

ฉันพบปัญหาเดียวกันกับระบบที่ติดตั้งใหม่ แต่นี่เป็นปัญหาของ udev ไม่มี/dev/ttyโหนดดังนั้นฉันต้องทำ:

mknod -m 666 /dev/tty c 5 0

1
มันใช้งานได้สำหรับฉันเพราะ / dev / tty ถูกสร้างเป็นไฟล์แปลกมาก! (ดังนั้นคุณต้องลบออกแล้วสร้างใหม่ด้วย mknod)
Doomsday

@Geoffroy ฉันลบ / dev / tty และตอนนี้เมื่อทำ sudo ฉันต้องเผชิญกับข้อผิดพลาดนี้: sudo: ขอโทษคุณต้องมี tty เพื่อให้ทำงาน sudo
Milad

@ xe4me ฉันไม่เคยบอกว่าคุณควรลบมันขึ้นอยู่กับระบบที่จำเป็นจริงๆ รีบูตควรแก้ไข
Geoffroy

@ Geoffroy ที่จริงผู้ประกาศข่าวคนแรกกล่าวว่าฉันต้องลบและสร้างใหม่: D ไม่รีบูตเครื่องไม่ทำงานฉันต้องบอกรากเขาแก้ไข: d
Milad

6

หากคุณอยู่ในอินทราเน็ตของสำนักงาน (อันตรายอย่างอื่น) ซึ่งได้รับการป้องกันโดยไฟร์วอลล์เพียงแค่มีบรรทัดต่อไปนี้ใน ~ / .ssh / config ของคุณ

โฮสต์ *
StrictHostKeyChecking no
UserKnownHostsFile = / dev / null


2
สิ่งนี้ยังคงเป็นอันตรายโดยที่เราไม่มีไฟร์วอลล์ขององค์กร คุณรู้ได้อย่างไรว่าคุณกำลังพูดคุยกับ GitHub จริงโดยไม่ต้องตรวจสอบคีย์เซิร์ฟเวอร์
Mnebuerquo

1
ในสภาพแวดล้อมขององค์กร repos คอมไพล์ส่วนใหญ่จะใช้ไม่ opensource หนึ่ง กรณีที่เลวร้ายที่สุด. ssh config ที่ด้านบนของไฟล์สามารถมี github โฮสต์ที่เกี่ยวข้องอย่างชัดเจนบรรทัดการกำหนดค่าสำหรับ ssh เพื่อเลือกการจับคู่ที่เฉพาะเจาะจงมากขึ้น
sun

5

สิ่งที่ทำงานสำหรับฉันเป็นครั้งแรกเพิ่มคีย์ SSH ของฉันของคอมพิวเตอร์เครื่องใหม่ผมทำตามคำแนะนำเหล่านี้จากGitLab - เพิ่มคีย์ โปรดทราบว่าตั้งแต่ฉันอยู่บน Win10 ฉันต้องทำคำสั่งทั้งหมดใน Git Bash บน Windows (มันไม่ได้ทำงานใน DOS cmd Shell ปกติ)

จากนั้นอีกครั้งใน Git Bash ฉันต้องทำgit cloneธุรกรรมซื้อคืนที่ฉันมีปัญหาด้วยและในกรณีของฉันฉันต้องคัดลอกชื่ออื่นเนื่องจากฉันมีเฉพาะที่และไม่ต้องการเสีย ตัวอย่างเช่น

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

จากนั้นฉันได้รับแจ้งให้เพิ่มไปยังรายการโฮสต์ที่รู้จักคำถามอาจเป็นคำถามนี้:

คุณแน่ใจหรือไม่ว่าต้องการเชื่อมต่อ (ใช่ / ไม่ใช่)

ฉันพิมพ์ "ใช่" และในที่สุดก็ใช้งานได้ตามปกติคุณควรได้รับข้อความที่คล้ายกับสิ่งนี้:

คำเตือน: เพิ่ม '[ลิงก์ repo ของคุณ]' (ECDSA) ลงในรายการโฮสต์ที่รู้จักอย่างถาวร

หมายเหตุ : หากคุณใช้ Windows ตรวจสอบให้แน่ใจว่าคุณใช้ Git Bash สำหรับคำสั่งทั้งหมดสิ่งนี้ไม่สามารถใช้งานได้ใน cmd shell หรือ PowerShell ปกติฉันต้องทำสิ่งนี้ใน Git Bash

ในที่สุดฉันก็ลบ repo โคลนอันที่สอง ( myRepo2ในตัวอย่าง) และกลับไปที่ repo แรกของฉันและในที่สุดฉันก็สามารถทำสิ่ง Git ทั้งหมดเหมือนปกติในเครื่องมือแก้ไข VSCode ที่ฉันโปรดปราน


ที่จริงแล้ว Cygwin prompt ของฉันดูเหมือนเกือบจะเหมือนกับ bash prompt ของฉัน แต่มันใช้ได้กับ gash bash prompt เท่านั้น!
Josiah Yoder

3

หากคุณใช้ git สำหรับ Windows

  • เปิด GUI git
  • เปิดที่เก็บโลคัล git ใน git GUI
  • เพิ่มรีโมตหรือพุชหากรีโมตมีอยู่แล้ว
  • ตอบคำถามว่าคุณต้องการดำเนินการต่อหรือไม่

ไคลเอ็นต์ GUI ~/.ssh/known_hostsเพิ่มที่สำคัญสำหรับคุณ วิธีนี้ง่ายต่อการจดจำหากคุณไม่ทำบ่อยและหลีกเลี่ยงความจำเป็นในการใช้บรรทัดคำสั่ง git (บรรทัดคำสั่งมาตรฐานของ Windows ไม่มีssh-keyscanไฟล์ปฏิบัติการ)


2

เมื่อเซิร์ฟเวอร์ระยะไกลต้องการเชื่อมต่อกับ repo ส่วนตัวก็จะตรวจสอบผ่าน ssh สร้างคู่คีย์ส่วนตัวกับสาธารณะด้วย ssh-keygen หรือถ้าคุณมีคีย์สาธารณะส่วนตัวแล้ว คัดลอกและวางกุญแจสาธารณะในการตั้งค่าของ repo ส่วนตัว

YourPrivateRepo -> การตั้งค่า -> ปรับใช้คีย์ -> เพิ่มคีย์การนำไปใช้ -> วางคีย์สาธารณะ

ตอนนี้เซิร์ฟเวอร์ระยะไกลจะสามารถเชื่อมต่อกับ repo ส่วนตัว

หมายเหตุ: ปุ่มปรับใช้มีการเข้าถึงสำหรับการอ่าน repo เท่านั้น จำเป็นต้องอนุญาตการเข้าถึงการเขียนอย่างชัดเจน


1

หมายความว่ารีโมตโฮสต์คีย์ของคุณถูกเปลี่ยน (อาจเป็นการเปลี่ยนรหัสผ่านโฮสต์)

เทอร์มินัลของคุณแนะนำให้รันคำสั่งนี้ในฐานะผู้ใช้รูท

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

คุณต้องลบชื่อโฮสต์นั้นออกจากรายการโฮสต์บนพีซี / เซิร์ฟเวอร์ของคุณ คัดลอกคำสั่งที่แนะนำและดำเนินการในฐานะผู้ใช้รูท

$ 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)?

พิมพ์ใช่เป็นการตอบสนอง

นั่นคือวิธีที่ฉันแก้ไขปัญหาของฉัน แต่ถ้าคุณพยายามกดปุ่ม Enter มันจะไม่ทำงาน!


0

คุณสามารถใช้ "git url" ในรูปแบบ URL "https" ใน Jenkinsfile หรือที่ใดก็ได้ที่คุณต้องการ

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 clonerepo ที่ไม่ใช่ของฉัน การแก้ไขคือการแยกแล้วโคลน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.