Không thể thương lượng với XX.XXX.XX.XX: không tìm thấy loại khóa máy chủ phù hợp. Đề nghị của họ: ssh-dss


110

Tôi đang cố gắng tạo kho lưu trữ git trên máy chủ web của mình và sao chép nó trên máy tính của mình. Đây là những gì tôi đã làm:

  1. Tôi đã tạo một kho lưu trữ trên máy chủ từ xa.
  2. Tôi tạo ra một cặp khóa: ssh-keygen -t dsa.
  3. Tôi đã thêm khóa của mình vào ssh-agent.
  4. Tôi đã sao chép vào khóa công khai của máy chủ trong ~/.ssh.

Và sau đó, sau khi cố gắng chạy lệnh git clone ssh://user@host/path-to-repository, tôi gặp lỗi:

Không thể thương lượng với XX.XXX.XX.XX: không tìm thấy loại khóa máy chủ phù hợp. Đề nghị của họ: ssh-dss Fat
: Không thể đọc từ kho lưu trữ từ xa.
Hãy đảm bảo rằng bạn có quyền truy cập chính xác và kho lưu trữ tồn tại.

Điều đó nghĩa là gì?


Câu trả lời:


171

Theo mặc định, phiên bản openssh gần đây không dùng khóa DSA. Bạn nên đề xuất với nhà cung cấp GIT của mình để thêm một số khóa máy chủ hợp lý. Chỉ dựa vào DSA không phải là một ý kiến ​​hay.

Để giải quyết vấn đề này, bạn cần cho sshkhách hàng biết rằng bạn muốn chấp nhận khóa máy chủ DSA, như được mô tả trong tài liệu chính thức về cách sử dụng cũ . Bạn có một vài khả năng, nhưng tôi khuyên bạn nên thêm những dòng này vào ~/.ssh/configtệp của mình :

Host your-remote-host
    HostkeyAlgorithms +ssh-dss

Khả năng khác là sử dụng biến môi trường GIT_SSHđể chỉ định các tùy chọn này:

GIT_SSH_COMMAND="ssh -oHostKeyAlgorithms=+ssh-dss" git clone ssh://user@host/path-to-repository

1
Bây giờ nó đã hoạt động mà không cần chỉ định tên máy chủ, chỉ với HostkeyAlgorithms +ssh-dss. Cảm ơn.
giovannipds

1
@giovannipds Nó chắc chắn phải là máy chủ từ xa mà bạn đang kết nối. @ downvoters Giải thích về các phiếu phản đối sẽ rất hay.
Jakuje

@Jakuje xin lỗi anh bạn, tôi đã nhấp nhầm và vì không thể thay đổi ngay lập tức, tôi không thể cập nhật câu trả lời của mình.
giovannipds

1
@Jakuje Tôi đã cập nhật phiếu bầu của mình, chỉ để cho bạn biết. =)
giovannipds

Nếu không có tệp như vậy trong thư mục .ssh của bạn, tệp văn bản trống có tên "config" sẽ làm được.
RMorrisey

78

Bạn cũng có thể thêm -oHostKeyAlgorithms=+ssh-dssvào dòng ssh của mình:

ssh -oHostKeyAlgorithms=+ssh-dss user@host

Đây là giải pháp +1 nhanh nhất vì nó cũng khắc phục vĩnh viễn sự cố cho máy chủ đó. Một gợi ý nữa về lâu dài là nếu có thể hệ thống máy chủ lưu trữ nên nâng cấp daemon SSH vì nó xuất hiện DSS nó không còn được coi là an toàn nữa.
Areeb Soo Yasir

20

Đối với tôi điều này đã hoạt động: (được thêm vào .ssh\config)

Host *
HostkeyAlgorithms +ssh-dss
PubkeyAcceptedKeyTypes +ssh-dss

Tùy chọn thứ hai không liên quan đến vấn đề và tùy chọn đầu tiên đã được đề cập trong câu trả lời của tôi.
Jakuje

Lưu trữ máy chủ lưu trữ của bạn không hoạt động đối với tôi, miễn là máy chủ lưu trữ của bạn là tên của máy chủ lưu trữ mà tôi đang chạy lệnh ssh từ (máy khách). Nhưng Máy chủ * đã làm việc cho tôi.
Krischu

2
@Krischu không, yuor-hostlà máy chủ lưu trữ mà bạn đang sshchống lại. Đặt mặc định không an toàn cho tất cả các máy chủ luôn là một ý tưởng tồi.
Jakuje

10

Nếu bạn giống tôi và không muốn tạo lỗ hổng bảo mật này cho hệ thống hoặc toàn người dùng, thì bạn có thể thêm tùy chọn cấu hình cho bất kỳ kho git nào cần điều này bằng cách chạy lệnh này trong các kho lưu trữ đó. (lưu ý chỉ hoạt động với phiên bản git> = 2.10, phát hành 2016-09-04)

git config core.sshCommand 'ssh -oHostKeyAlgorithms=+ssh-dss'

Tuy nhiên, điều này chỉ hoạt động sau khi repo được thiết lập. Nếu bạn không thoải mái khi thêm điều khiển từ xa theo cách thủ công (và chỉ muốn sao chép) thì bạn có thể chạy bản sao như sau:

GIT_SSH_COMMAND='ssh -oHostKeyAlgorithms=+ssh-dss' git clone ssh://user@host/path-to-repository

sau đó chạy lệnh đầu tiên để đặt nó vĩnh viễn.

Nếu bạn không có thông tin mới nhất và vẫn muốn giữ lỗ cục bộ nhất có thể, tôi khuyên bạn nên đặt

export GIT_SSH_COMMAND='ssh -oHostKeyAlgorithms=+ssh-dss'

trong một tệp ở đâu đó, nói git_ssh_allow_dsa_keys.shvà nhập sourcenó khi cần.


3

Tôi muốn cộng tác một chút với giải pháp cho phía máy chủ. Vì vậy, máy chủ nói rằng nó không hỗ trợ DSA, điều này là do máy khách openssh không kích hoạt nó theo mặc định :

Tương tự, OpenSSH 7.0 trở lên vô hiệu hóa thuật toán khóa công khai ssh-dss (DSA). Nó quá yếu và chúng tôi khuyên bạn không nên sử dụng nó.

Vì vậy, để khắc phục điều này ở phía máy chủ, tôi nên kích hoạt các thuật toán Chính khác như RSA o ECDSA. Tôi vừa gặp sự cố này với một máy chủ trong một mạng lan. Tôi đề nghị như sau:

Cập nhật openssh:

yum update openssh-server

Hợp nhất các cấu hình mới trong sshd_config nếu có sshd_config.rpmnew.

Xác minh có các khóa máy chủ tại / etc / ssh /. Nếu không tạo ra những cái mới, hãy xem man ssh-keygen.

$ ll /etc/ssh/
total 580
-rw-r--r--. 1 root root     553185 Mar  3  2017 moduli
-rw-r--r--. 1 root root       1874 Mar  3  2017 ssh_config
drwxr-xr-x. 2 root root       4096 Apr 17 17:56 ssh_config.d
-rw-------. 1 root root       3887 Mar  3  2017 sshd_config
-rw-r-----. 1 root ssh_keys    227 Aug 30 15:33 ssh_host_ecdsa_key
-rw-r--r--. 1 root root        162 Aug 30 15:33 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys    387 Aug 30 15:33 ssh_host_ed25519_key
-rw-r--r--. 1 root root         82 Aug 30 15:33 ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys   1675 Aug 30 15:33 ssh_host_rsa_key
-rw-r--r--. 1 root root        382 Aug 30 15:33 ssh_host_rsa_key.pub

Xác minh cấu hình HostKey trong / etc / ssh / sshd_config. Nó sẽ cho phép cấu hình RSA và ECDSA. (Nếu tất cả chúng được nhận xét theo mặc định, nó sẽ cho phép quá RSA, hãy xem trong man sshd_configphần của HostKey).

# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

Đối với phía máy khách, hãy tạo khóa cho ssh (không phải DSA như trong câu hỏi) bằng cách chỉ thực hiện như sau:

ssh-keygen

Sau đó, vì có nhiều tùy chọn hơn ssh-dss (DSA), máy khách openssh (> = v7) nên kết nối với RSA hoặc thuật toán tốt hơn.

Đây là một bài báo hay.

Đây là câu hỏi đầu tiên của tôi được trả lời, tôi hoan nghênh các đề xuất: D.


1

Làm thế nào để chỉ định nhiều thuật toán? Tôi hỏi vì git vừa được cập nhật trên máy tính xách tay làm việc của tôi, (Windows 10, sử dụng Git chính thức cho bản dựng Windows) và tôi gặp lỗi này khi cố gắng đẩy một nhánh dự án vào điều khiển từ xa Azure DevOps của mình. Tôi đã cố gắng đẩy --set-ngược dòng và nhận được điều này:

Unable to negotiate with 20.44.80.98 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Vì vậy, làm thế nào một người sẽ thực hiện các đề xuất ở trên cho phép cả hai điều đó? (Để hoàn thành nhanh chóng, tôi đã sử dụng giải pháp của @ golvok với group14 và nó hoạt động, nhưng tôi thực sự không biết liệu 1 hay 14 tốt hơn, v.v.)


-3

Bạn có thể làm theo phương pháp trên hoặc phương pháp này

Tạo tệp cấu hình trong thư mục .ssh và thêm dòng này.

host xxx.xxx
 Hostname xxx.xxx
 IdentityFile ~/.ssh/id_rsa
 User xxx
 KexAlgorithms +diffie-hellman-group1-sha1

Đó là giải quyết vấn đề hoàn toàn khác.
Jakuje
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.