Tidak dapat bernegosiasi dengan XX.XXX.XX.XX: tidak ditemukan jenis kunci host yang cocok. Tawaran mereka: ssh-dss

110

Saya mencoba membuat repositori git di host web saya dan mengkloningnya di komputer saya. Inilah yang saya lakukan:

  1. Saya membuat repositori di server jarak jauh.
  2. Saya dihasilkan sepasang kunci: ssh-keygen -t dsa.
  3. Saya menambahkan kunci saya ke ssh-agent.
  4. Saya menyalin ke kunci publik server di ~/.ssh.

Dan kemudian, setelah mencoba menjalankan perintah git clone ssh://user@host/path-to-repository, saya mendapatkan kesalahan:

Tidak dapat bernegosiasi dengan XX.XXX.XX.XX: tidak ditemukan jenis kunci host yang cocok. Tawaran mereka: ssh-dss
fatal: Tidak dapat membaca dari repositori jarak jauh.
Harap pastikan Anda memiliki hak akses yang benar dan repositori ada.

Apa artinya?

Nikita Gorshkov
sumber

Jawaban:

171

Secara default, kunci DSA versi openssh baru-baru ini tidak digunakan lagi. Anda harus menyarankan penyedia GIT Anda untuk menambahkan beberapa kunci host yang masuk akal. Mengandalkan hanya pada DSA bukanlah ide yang baik.

Sebagai solusinya, Anda perlu memberi tahu sshklien Anda bahwa Anda ingin menerima kunci host DSA, seperti yang dijelaskan dalam dokumentasi resmi untuk penggunaan lama . Anda memiliki sedikit kemungkinan, tetapi saya sarankan untuk menambahkan baris ini ke dalam ~/.ssh/configfile Anda :

Host your-remote-host
    HostkeyAlgorithms +ssh-dss

Kemungkinan lainnya adalah menggunakan variabel lingkungan GIT_SSHuntuk menentukan opsi ini:

GIT_SSH_COMMAND="ssh -oHostKeyAlgorithms=+ssh-dss" git clone ssh://user@host/path-to-repository
Jakuje
sumber
1
Sekarang ini telah bekerja tanpa menentukan nama host, hanya dengan HostkeyAlgorithms +ssh-dss. Terima kasih.
giovannipds
1
@giovannipds Ini tentunya harus menjadi host jarak jauh yang Anda sambungkan. @ downvoters Menjelaskan downvote akan menyenangkan.
Jakuje
@Jakuje maaf bung, saya salah mengklik, dan karena ketidakmungkinan untuk langsung mengubah, saya tidak dapat memperbarui jawaban saya.
giovannipds
1
@Jakuje Saya sudah memperbarui pilihan saya, hanya untuk memberi tahu Anda. =)
giovannipds
Jika tidak ada file seperti itu di direktori .ssh Anda, file teks kosong bernama "config" bisa digunakan.
RMorrisey
78

Anda juga dapat menambahkan -oHostKeyAlgorithms=+ssh-dssbaris ssh Anda:

ssh -oHostKeyAlgorithms=+ssh-dss user@host
Guillaume
sumber
Ini adalah solusi tercepat +1 karena ini juga memperbaiki masalah host tersebut secara permanen. Satu lagi saran untuk jangka panjang adalah bahwa jika mungkin sistem host harus mengupgrade daemon SSH-nya karena tampaknya DSS itu tidak dianggap sangat aman lagi.
Areeb Soo Yasir
20

Bagi saya ini berhasil: (ditambahkan ke .ssh\config)

Host *
HostkeyAlgorithms +ssh-dss
PubkeyAcceptedKeyTypes +ssh-dss
pengguna2885534
sumber
Opsi kedua tidak terkait dengan masalah dan yang pertama sudah disebutkan dalam jawaban saya.
Jakuje
Host your-host tidak berfungsi untuk saya, asalkan host-Anda adalah nama host tempat saya menjalankan perintah ssh dari (klien). Tapi Host * bekerja untuk saya.
Krischu
2
@Krischu no, yuor-hostadalah tuan rumah yang akan Anda sshlawan. Menetapkan default yang tidak aman untuk semua host selalu merupakan ide yang buruk.
Jakuje
10

Jika Anda seperti saya, dan lebih suka tidak membuat sistem lubang keamanan ini atau untuk seluruh pengguna, Anda dapat menambahkan opsi konfigurasi ke repo git mana pun yang memerlukannya dengan menjalankan perintah ini di repo tersebut. (catatan hanya berfungsi dengan versi git> = 2.10, dirilis 04-09-2016)

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

Ini hanya berfungsi setelah repo disiapkan. Jika Anda tidak nyaman menambahkan remote secara manual (dan hanya ingin mengkloning) maka Anda dapat menjalankan klon seperti ini:

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

lalu jalankan perintah pertama untuk membuatnya permanen.

Jika Anda tidak memiliki yang terbaru, dan masih ingin menjaga lubang se-lokal mungkin, saya sarankan untuk meletakkannya

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

dalam file di suatu tempat, katakanlah git_ssh_allow_dsa_keys.sh, dan sourcesimpan saat dibutuhkan.

golvok
sumber
3

Saya ingin sedikit berkolaborasi dengan solusi untuk sisi server. Jadi, server mengatakan tidak mendukung DSA, ini karena klien openssh tidak mengaktifkannya secara default :

OpenSSH 7.0 dan yang lebih baru juga menonaktifkan algoritme kunci publik ssh-dss (DSA). Itu juga lemah dan kami merekomendasikan untuk tidak menggunakannya.

Jadi, untuk memperbaikinya di sisi server saya harus mengaktifkan algoritma kunci lain seperti RSA o ECDSA. Saya baru saja mengalami masalah ini dengan server di lan. Saya menyarankan yang berikut:

Perbarui openssh:

yum update openssh-server

Gabungkan konfigurasi baru di sshd_config jika ada sshd_config.rpmnew.

Pastikan ada kunci host di / etc / ssh /. Jika tidak menghasilkan yang baru, lihat 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

Verifikasi di / etc / ssh / sshd_config konfigurasi HostKey. Ini harus memungkinkan konfigurasi RSA dan ECDSA. (Jika semuanya diberi komentar secara default maka RSA juga akan diizinkan, lihat di man sshd_configbagian 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

Untuk sisi klien, buat kunci untuk ssh (bukan DSA seperti dalam pertanyaan) dengan hanya melakukan ini:

ssh-keygen

Setelah ini, karena ada lebih banyak opsi daripada ssh-dss (DSA) klien openssh (> = v7) harus terhubung dengan RSA atau algoritma yang lebih baik.

Berikut artikel bagus lainnya.

Ini pertanyaan pertama saya terjawab, saya menyambut saran: D.

Gus Calca
sumber
1

Bagaimana seseorang menentukan beberapa algoritma? Saya bertanya karena git baru saja memperbarui di laptop kerja saya, (Windows 10, menggunakan Git resmi untuk pembuatan Windows,) dan saya mendapat kesalahan ini ketika saya mencoba mendorong cabang proyek ke remote Azure DevOps saya. Saya mencoba mendorong --set-upstream dan mendapatkan ini:

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.

Jadi, bagaimana cara menerapkan saran di atas yang memungkinkan keduanya? (Sebagai cara cepat untuk menyelesaikannya, saya menggunakan solusi @ golvok dengan group14 dan berhasil, tetapi saya benar-benar tidak tahu apakah 1 atau 14 lebih baik, dll.)

Janet
sumber
-3

Anda bisa mengikuti pendekatan di atas atau yang ini

Buat file konfigurasi di direktori .ssh dan tambahkan baris ini.

host xxx.xxx
 Hostname xxx.xxx
 IdentityFile ~/.ssh/id_rsa
 User xxx
 KexAlgorithms +diffie-hellman-group1-sha1
ashokhein
sumber
Itu memecahkan masalah yang sama sekali berbeda.
Jakuje