Lỗi Git: Xác minh khóa máy chủ lưu trữ không thành công khi kết nối với kho lưu trữ từ xa


220

Tôi đang cố gắng kết nối với kho Git từ xa cư trú trên máy chủ web của mình và sao chép nó vào máy của tôi.

Tôi đang sử dụng định dạng sau cho lệnh của mình:

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

Điều này đã làm việc tốt cho hầu hết các thành viên trong nhóm của tôi. Thông thường sau khi chạy lệnh này, Git sẽ nhắc nhập mật khẩu của người dùng và sau đó chạy nhân bản. Tuy nhiên, khi chạy trên một trong các máy của tôi, tôi gặp phải lỗi sau:

Xác minh khóa máy chủ không thành công.

gây tử vong: Không thể đọc từ kho lưu trữ từ xa.

Chúng tôi không sử dụng các khóa SSH để kết nối với kho lưu trữ này, vì vậy tôi không chắc tại sao Git lại kiểm tra một khóa trên máy cụ thể này.


1
Bạn đang sử dụng SSH để kết nối với kho lưu trữ này, hãy chú ý cách URL của bạn bắt đầu bằngssh://
Brandon

Tôi có một vấn đề tương tự . Ai đó giúp tôi được không, làm ơn? Tôi bị kẹt :(
SepSol

Câu trả lời:


163

Bạn đang kết nối thông qua giao thức SSH, như được chỉ ra bởi ssh://tiền tố trên URL bản sao của bạn. Sử dụng SSH, mọi máy chủ đều có khóa. Khách hàng nhớ khóa máy chủ được liên kết với một địa chỉ cụ thể và từ chối kết nối nếu khóa máy chủ có vẻ thay đổi. Điều này ngăn chặn con người trong các cuộc tấn công giữa.

Khóa máy chủ cho domain.com đã thay đổi. Nếu điều này có vẻ không hợp với bạn , hãy xóa khóa cũ khỏi bộ đệm cục bộ của bạn bằng cách chỉnh sửa ${HOME}/.ssh/known_hostsđể xóa dòng cho domain.com hoặc để tiện ích SSH làm điều đó cho bạn

ssh-keygen -R domain.com

Từ đây, ghi lại khóa được cập nhật bằng cách tự làm với

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

hoặc tương đương, chúng ta hãy sshlàm điều đó cho bạn lần sau khi bạn kết nối với git fetch, git pullhoặc git push(hoặc thậm chí là một ol đồng bằng' ssh domain.com) bằng cách trả lời có khi được nhắc

Tính xác thực của máy chủ 'domain.com (abcd)' không thể được thiết lập.
Dấu vân tay của khóa RSA là XX: XX: ...: XX.
Bạn có chắc chắn muốn tiếp tục kết nối (có / không) không?

Lý do cho lời nhắc này là domain.com không còn trong bạn known_hostssau khi xóa nó và có lẽ không có trong hệ thống /etc/ssh/ssh_known_hosts, vì vậy sshkhông có cách nào để biết liệu máy chủ ở đầu kia của kết nối có thực sự là domain.com hay không. (Nếu khóa sai /etc, một người có đặc quyền quản trị sẽ phải cập nhật tệp toàn hệ thống.)

Tôi đặc biệt khuyến khích bạn xem xét việc người dùng xác thực bằng các khóa. Bằng cách đó, ssh-agentcó thể lưu trữ tài liệu chính để thuận tiện (thay vì mọi người phải nhập mật khẩu của cô ấy cho mỗi kết nối với máy chủ) và mật khẩu không đi qua mạng.


3
Thực tế thú vị, việc chạy sudo ssh-keygen -R domain.comcó thể đổi tên known_hoststập tin hiện tại của bạn thành known_hosts.oldvà tạo một bản sao chỉ có thể đọc được bằng root . ( -rw------- root root) Bạn có thể dễ dàng chownquay lại với người dùng thích hợp, nhưng bạn cũng có thể lãng phí một buổi chiều gỡ lỗi tại sao git bị hỏng. : D
Andrew Rueckert

1
Are you sure you want to continue connecting (yes/no)?. Đừng phạm sai lầm như tôi. Bạn cần gõ yes. Đơn giản chỉ cần nhấn enter không chọn có theo mặc định
JolonB

304

Như tôi đã trả lời trước đây trong Nhân bản git repo gây ra lỗi - Xác minh khóa máy chủ không thành công. gây tử vong: Kết thúc từ xa bị treo bất ngờ , thêm GitHub vào danh sách máy chủ được ủy quyền:

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


3
Đây là cách an toàn nhất, không có chìa khóa. Giả sử bạn chỉ chạy nó một lần, không phải mỗi lần bạn kết nối với máy chủ.
Zenexer

Kho lưu trữ phù hợp riêng tư của công ty tôi đang sử dụng ecdsa làm khóa, vì vậy nếu giải pháp không hoạt động, có thể đó là do thuật toán không chính xác
Fendy

8
Đây phải là câu trả lời được chấp nhận. Cảm ơn vì đã cứu ngày của tôi.
Keyur

cũng làm việc cho tôi, tôi đã tự hỏi tại sao tôi không thể sao chép repo của riêng mình
StackAttack

Ai đó đã gắn cờ bài đăng này (không chính xác). Từ đánh giá .
Ái Hà Lee

55

Tôi gặp vấn đề tương tự, nhưng, sử dụng các khóa SSH. Từ câu trả lời của Tupy, ở trên, tôi đã phát hiện ra rằng vấn đề là do tệp know_hosts không có mặt hoặc github.com không có mặt trong danh sách các máy chủ đã biết. Dưới đây là các bước tôi đã làm theo để giải quyết nó -

  1. mkdir -p ~/.ssh
  2. ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
  3. ssh-keygen -t rsa -C "user.email"
  4. mở khóa công khai bằng lệnh này $ cat ~/.ssh/id_rsa.pubvà sao chép nó.
  5. Thêm khóa id_rsa.pub vào danh sách khóa SSH trên hồ sơ GitHub của bạn.

1
@OJFord FYI: Tôi đã chỉnh sửa câu trả lời ban đầu theo cách khiến nhận xét của bạn trở nên lỗi thời. TBH và với tất cả sự tôn trọng, điều đó không hoàn toàn chính xác ngay từ đầu. Các touchlệnh sẽ thất bại trong trường hợp ~/.sshthư mục không tồn tại, vì vậy bước 1 vẫn yêu cầu. Ngoài ra, bạn không cần phải touchtập tin trước khi sử dụng >>chuyển hướng. Nó sẽ được tạo nếu cần thiết (nhưng chỉ là tệp, không phải toàn bộ đường dẫn, vì vậy vẫn mkdir -pcần thiết). Các -ptùy chọn làm cho nó hoạt động trong trường hợp các thư mục đã tồn tại.
Tad Lispy

1
Đó là số 2 ssh-keyscanbị thiếu trong các tài liệu Github khi thêm khóa ssh mới.
Phil Andrew

1
Tôi đã có vấn đề với Dockerfileviệc thiếu sự cho phép của tôi. Thêm bước thứ 2 vào đây đã khắc phục vấn đề đó! Cảm ơn bạn vì công việc tuyệt vời
Spencer Pollock

37

Điều này đang xảy ra vì github hiện không có trong máy chủ đã biết của bạn.

Bạn nên được nhắc thêm github vào máy chủ đã biết. Nếu điều này không xảy ra, bạn có thể chạy ssh -T git@github.comđể nhận lại lời nhắc.


2
Đây là câu trả lời đúng nếu bạn không bao giờ được nhắc.
Matthias Hagemann

15

Đối với tôi, tôi chỉ cần gõ "có" tại dấu nhắc hỏi "Bạn có chắc chắn muốn tiếp tục kết nối (có / không) không?" thay vì chỉ nhấn Enter.


Câu trả lời này khiến tôi nhận ra rằng tôi phải sao chép thủ công repo của mình trên máy chủ xây dựng của mình để nhập 'có' và nhận máy chủ bitbucket của tôi được thêm vào
know_hosts

1
@Sashah Nếu tất cả những gì bạn cần là máy chủ bitbucket trong know_hosts, bạn có thể chỉnh sửa tệp theo cách thủ công. Không cần phải sao chép repo nếu đây là lý do duy nhất để làm như vậy.
Code-Apprentice

7

Tôi gặp vấn đề tương tự trên một hệ thống mới được cài đặt, nhưng đây là một vấn đề udev. Không có /dev/ttynút, vì vậy tôi phải làm:

mknod -m 666 /dev/tty c 5 0

1
Nó hoạt động với tôi vì / dev / tty được tạo như một tệp, rất kỳ quặc! (vì vậy bạn phải xóa nó sau đó tạo lại nó bằng mknod)
Doomsday

@Geoffroy, tôi đã xóa / dev / tty và bây giờ khi làm sudo, tôi gặp phải lỗi này: sudo: xin lỗi, bạn phải có một tty để chạy sudo
Milad

@ xe4me Tôi chưa bao giờ nói bạn nên gỡ bỏ nó, tùy thuộc vào hệ thống mà nó thực sự cần thiết. Khởi động lại nên sửa nó.
Geoffroy

@Geoffroy, thực sự là nhà bình luận đầu tiên, nói rằng tôi phải gỡ bỏ và tạo lại: Không, khởi động lại không hoạt động, tôi phải nói với root, anh ấy đã sửa nó: d
Milad

6

Nếu bạn đang ở trong mạng nội bộ văn phòng (nếu không nguy hiểm) luôn được bảo vệ bởi tường lửa thì chỉ cần có các dòng sau trong ~ / .ssh / config của bạn

Máy chủ * StricthostKeyChecking
không có
UserKnownhostsFile = / dev / null


2
Điều này vẫn còn nguy hiểm, với tường lửa của chúng tôi không có công ty. Làm thế nào để bạn biết bạn đang nói chuyện với github thực sự mà không cần xác minh khóa máy chủ?
Mnebuerquo

1
Trong môi trường doanh nghiệp, các gos repos địa phương hầu hết được sử dụng, không bao giờ mở nguồn. Trường hợp xấu nhất .ssh config ở đầu tệp có thể có các dòng cấu hình liên quan đến máy chủ rõ ràng github cho ssh để chọn các kết quả khớp cụ thể hơn.
nắng

5

Điều làm việc cho tôi là trước tiên hãy thêm khóa SSH của máy tính mới, tôi đã làm theo các hướng dẫn này từ GitLab - thêm khóa SSH . Lưu ý rằng vì tôi đang dùng Win10, tôi đã phải thực hiện tất cả các lệnh này trong Git Bash trên Windows (nó không hoạt động trong Shell cmd DOS thông thường).

Sau đó, một lần nữa trong Git Bash, tôi đã phải thực hiện một git clonerepo mà tôi gặp vấn đề, và trong trường hợp của tôi, tôi đã phải sao chép nó sang một tên khác vì tôi đã có nó tại địa phương và không muốn mất các cam kết của mình. Ví dụ

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

Sau đó, tôi nhận được lời nhắc để thêm nó vào danh sách máy chủ đã biết, câu hỏi có thể là câu hỏi này:

Bạn có chắc chắn muốn tiếp tục kết nối (có / không) không?

Tôi đã gõ "có" và cuối cùng nó cũng hoạt động, thông thường bạn sẽ nhận được một thông báo tương tự như sau:

Cảnh báo: Đã thêm vĩnh viễn '[liên kết repo của bạn]' (ECDSA) vào danh sách các máy chủ đã biết.

Lưu ý : nếu bạn đang ở trên Windows, hãy đảm bảo rằng bạn sử dụng Git Bash cho tất cả các lệnh, điều này không hoạt động trong shell cmd thông thường hoặc powershell, tôi thực sự phải làm điều này trong Git Bash.

Cuối cùng tôi đã xóa repo clone thứ hai ( myRepo2trong ví dụ) và quay lại repo đầu tiên của tôi và cuối cùng tôi có thể làm tất cả các công cụ Git như bình thường trong VSCode trình soạn thảo yêu thích của tôi.


Thật vậy, dấu nhắc Cygwin của tôi trông gần giống hệt như dấu nhắc git bash của tôi, nhưng nó chỉ hoạt động trong dấu nhắc git bash!
Josiah Yoder

3

Nếu bạn đang sử dụng git cho Windows.

  • Mở GUI git.
  • Mở kho git cục bộ trong GUI git.
  • Thêm điều khiển từ xa hoặc đẩy nếu điều khiển từ xa đã tồn tại.
  • Trả lời "có" cho câu hỏi về việc bạn có muốn tiếp tục không.

GUI khách thêm khóa cho bạn ~/.ssh/known_hosts. Điều này dễ nhớ hơn nếu bạn không làm điều đó thường xuyên và cũng tránh được nhu cầu sử dụng dòng lệnh git (dòng lệnh Windows tiêu chuẩn không có ssh-keyscankhả năng thực thi.


2

Khi máy chủ từ xa muốn kết nối với repo riêng, nó sẽ xác thực qua ssh. Tạo cặp khóa riêng-công khai với ssh-keygen hoặc nếu bạn đã có khóa chung-riêng. sao chép và dán khóa công khai trong Cài đặt của repo riêng.

YourPrivateRepo -> Cài đặt -> Khóa triển khai -> Thêm khóa triển khai -> Dán khóa chung.

Bây giờ máy chủ từ xa sẽ có thể kết nối với repo riêng.

LƯU Ý: Các khóa triển khai chỉ có quyền truy cập để đọc repo. Cần phải rõ ràng cho phép truy cập viết.


1

Nó có nghĩa là khóa máy chủ từ xa của bạn đã được thay đổi (Có thể là thay đổi mật khẩu máy chủ),

Thiết bị đầu cuối của bạn đề nghị thực hiện lệnh này với tư cách là người dùng root

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

Bạn phải xóa tên máy chủ đó khỏi danh sách máy chủ trên máy chủ / máy chủ của bạn. Sao chép lệnh được đề xuất đó và thực thi như một người dùng 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

Thử lại, Hy vọng điều này hoạt động.


Lưu ý: tùy thuộc vào vỏ của bạn, bạn có thể phải thoát dấu ngoặc vuông \ [và \] hoặc sử dụng dấu ngoặc kép.
Phlarx

1

Khi được hỏi:

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

Nhập như là phản hồi

Đó là cách tôi giải quyết vấn đề của mình. Nhưng nếu bạn cố nhấn nút enter, nó sẽ không hoạt động!


0

Bạn có thể sử dụng "git url" ở định dạng URL 'https "trong Jenkinsfile hoặc bất cứ nơi nào bạn muốn.

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


0

Tôi đã gặp phải lỗi tương tự bên trong DockerFile trong thời gian xây dựng trong khi hình ảnh được công khai. Tôi đã sửa đổi rất ít trong Dockerfile.

 RUN git clone  https://github.com/kacole2/express-node-mongo-skeleton.git /www/nodejs

Điều này có thể là do sử dụng cú pháp git@github.com: ... kết thúc> sử dụng SSH để sao chép và bên trong vùng chứa, khóa riêng của bạn không có sẵn>. Thay vào đó, bạn sẽ muốn sử dụng RUN git clone> https://github.com/edenhill/librdkafka.git .


-1

Tôi gặp vấn đề tương tự, không may là tôi đã sử dụng HMI GitExtensions và quên rằng tôi đã viết một cụm mật khẩu. Với HMI .... hãy quên nó đi! Không nhập cụm mật khẩu khi bạn tạo khóa của mình!


-4

Tôi nhận được tin nhắn này khi tôi cố gắng git clonemột repo không phải của tôi. Các sửa chữa là ngã ba và sau đó nhân bản.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.