Apa itu sidik jari kunci SSH dan bagaimana sidik jari itu dihasilkan?

129

Saya selalu menemukan bahwa saya mendapatkan pesan ini ketika saya sshmasuk ke mesin baru:

12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53

Apa artinya itu? Apakah setiap mesin memiliki sidik jari yang sama setiap saat?

Bagaimana sidik jari ini dihasilkan? Parameter apa yang mereka andalkan?

Kit Ho
sumber

Jawaban:

65

Sidik jari didasarkan pada kunci Publik Host, biasanya didasarkan pada "/etc/ssh/ssh_host_rsa_key.pub" Umumnya untuk memudahkan identifikasi / verifikasi host yang Anda hubungkan.

Jika sidik jari berubah, mesin yang Anda sambungkan telah mengubah kunci publik mereka. Ini mungkin bukan hal yang buruk (terjadi dari menginstal ulang ssh), tetapi itu juga bisa menunjukkan bahwa Anda terhubung ke mesin yang berbeda di domain / IP yang sama (terjadi ketika Anda menghubungkan melalui sesuatu seperti load balancer) atau bahwa Anda sedang ditargetkan dengan serangan man-in-the-middle, di mana penyerang entah bagaimana mencegat / mengubah rute koneksi ssh Anda untuk terhubung ke host yang berbeda yang dapat mengintai pengguna Anda / pw.

Intinya: jika Anda diperingatkan tentang sidik jari yang diubah, berhati-hatilah dan periksa kembali apakah Anda benar-benar terhubung ke host yang benar melalui koneksi yang aman. Meskipun sebagian besar waktu ini tidak berbahaya, ini bisa menjadi indikasi masalah potensial

Lihat: http://www.lysium.de/blog/index.php?/archives/186-How-to-get-ssh-server-fingerprint-information.html
dan: http://en.wikipedia.org/ wiki / Public_key_fingerprint

madmaze
sumber
5
"... hati-hati dan periksa kembali apakah Anda benar-benar terhubung ke host yang benar melalui koneksi yang aman" - pertanyaan bodoh, tetapi bagaimana Anda bisa melakukan ini dengan mudah?
Savara
1
@Savara Ketika Anda terhubung ke server SSH yang sebelumnya tidak Anda sambungkan, Anda harus meminta kunci publik dari server SSH dari admin server. Admin server akan memberi Anda sepotong teks. Anda harus menambahkan teks ini ke file ~/.ssh/known_hosts. Dengan cara ini, ketika Anda terhubung ke server, klien SSH Anda akan mengenali server ini, karena Anda telah menyimpan kunci publiknya known_hosts. Oleh karena itu, sebenarnya Anda tidak boleh mengatakan "ya" ketika klien SSH memberi tahu Anda "Keaslian tuan rumah tidak dapat dibuat". Anda harus selalu menambahkan kunci publik dari server sebelumnya.
Utku
@Savara Jika Anda melakukan ini, Anda akan tahu bahwa sesuatu yang mencurigakan sedang terjadi ketika klien SSH Anda memberi tahu Anda "Keaslian klien tidak dapat dibuat" atau ketika ia memberi tahu Anda "Kunci publik server telah diubah". Oleh karena itu, Anda harus selalu menambahkan kunci publik dari server ke ~/.ssh/known_hostsfile Anda sebelumnya dan tidak pernah mengatakan ya ketika klien SSH Anda memberi tahu Anda "Keaslian klien tidak dapat dibuat" atau ketika ia memberi tahu Anda "Kunci publik dari server telah diubah ".
Utku
3
Ya, saya sepenuhnya menyadari bagaimana mekanisme melihat sidik jari SSH bekerja, tetapi sebagian besar waktu Anda tidak memiliki opsi untuk mendapatkan sidik jari melalui saluran lain. Sayangnya, TOFU adalah yang terbaik yang sering kita dapatkan.
Savara
Apakah ada cara untuk memeriksa keaslian bahkan setelah menjawab "ya"?
tukarkan
104

Anda dapat membuat sidik jari untuk kunci publik menggunakan ssh-keygenseperti:

ssh-keygen -lf /path/to/key.pub

Contoh konkret (jika Anda menggunakan kunci publik RSA):

$ ssh-keygen -lf ~/.ssh/id_rsa.pub
2048 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff /Users/username/.ssh/id_rsa.pub (RSA)

Bagian pertama (2048)adalah panjang kunci dalam bit, bagian kedua (00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)adalah sidik jari kunci publik dan bagian ketiga adalah lokasi file kunci publik itu sendiri.

Benjamin Oakes
sumber
apakah Anda tahu bagaimana menerjemahkan ke 12: f8: 7e: 78: 61: b4: bf: e2: de: 24: 15: 96: 4e: d4: 72: 53 format ini dari kunci publik itu?
Kit Ho
@KitHo Saya tidak yakin apakah saya mengerti pertanyaan Anda. Saya memperbarui contoh, karena saya pikir ssh-keygen -lfakan melakukan apa yang Anda inginkan.
Benjamin Oakes
5
Ketika SSH memasuki mesin baru, apa yang dilihat orang bukanlah sidik jari pubkey pengguna, tetapi sidik jari pubkey host. Jadi contoh yang lebih baik untuk konteks pertanyaan adalah ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub. Ini menunjukkan sidik jari yang juga ditampilkan pada login SSH ke localhost.
tanius
58
Sidik jari saya yang ssh-keygendilaporkan sha256. Untuk mendapatkan md5sidik jari saya berlari ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub. #archlinux
Justin C
6
(@JustinC) OpenSSH versi 6.8 (Maret 2015) dan lebih tinggi berubah menjadi SHA256, ditampilkan dalam base64 daripada hex, secara default. Untuk penggunaan klien ssh -o FingerprintHash=md5atau yang setara dalam ssh_configdan pada hal-hal yang menggunakan sshsuka scp.
dave_thompson_085
72

Sidik jari adalah MD5 atas data biner dalam kunci publik yang disandikan Base64.

$ ssh-keygen -f foo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in foo.
Your public key has been saved in foo.pub.
The key fingerprint is:
65:30:38:96:35:56:4f:64:64:e8:e3:a4:7d:59:3e:19 andrew@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|       +*..+*    |
|      =. +.=     |
|     . . .o .    |
|         o+   E  |
|        S= . + o |
|        . o o +  |
|           .   . |
|                 |
|                 |
+-----------------+
$ cat foo.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp andrew@localhost
$ echo 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp' \
    | base64 -D | md5
6530389635564f6464e8e3a47d593e19

Md5sum 6530389635564f6464e8e3a47d593e19 adalah sidik jari yang ditampilkan ketika kunci dihasilkan, hanya tanpa titik dua yang memisahkan.


Namun, jika Anda berurusan dengan sidik jari yang ditunjukkan Amazon di konsol EC2 Key Pairs, sayangnya itu mungkin binatang yang berbeda . Jika string hex 32-digit, ini adalah sidik jari kunci publik standar MD5 SSH di atas. Tetapi jika 40 digit hex, sebenarnya sidik jari dihitung dengan mengambil SHA1 dari kunci pribadi dalam format PKCS # 8:

$ openssl pkcs8 -in foo -nocrypt -topk8 -outform DER | openssl sha1 -c
e2:77:39:d3:53:a7:62:68:5f:da:82:0e:99:61:30:64:a2:88:c4:58
andrew.n
sumber
1
Saya menemukan jawaban ini bermanfaat dalam skenario berikut. Sistem Anda menggunakan SHA1 untuk menghitung sidik jari, tetapi teman Anda menggunakan md5. Saya membagikan sidik jari yang SHA1 dan tidak cocok dengan MD5 yang dihasilkan sistemnya. Ini membantu - terima kasih! sed 's | ^ ssh-rsa ||' /etc/ssh/ssh_host_rsa_key.pub | sed 's | ==. * $ | == |' | base64 -d | md5sum
Liczyrzepa
Ini sangat relevan untuk memahami mengapa sidik jari ini tidak cocok dengan yang ada dalam catatan DNS SSHFP, karena mereka menggunakan SHA-1 atau SHA-256 digest.
neirbowj
1
@Liczyrzepa bidang publickey mungkin atau mungkin tidak memiliki '==' pada akhirnya tergantung pada jenis kunci dan bitsize; lebih aman dan IMO lebih mudah digunakan awk '{print $2}' /path/to/keyfile.pubatau serupa.
dave_thompson_085
13
Ini adalah satu-satunya jawaban yang menjelaskan bagaimana sidik jari dihitung
selesai
2
Namun dalam Linux Mint perintahnya adalah:cat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum
greuze
13

Jika Anda ingin memeriksa file kunci SSH untuk melihat apakah itu sama dengan apa yang dilaporkan sebagai "Deploy key" oleh github, ini untuk Anda ...

Dari URL pribadi: https://github.com/<username>/<repo_name>/settings/keys Anda akan melihat tangkapan layar dari github

Di terminal:

$ ls -l id*
-rw-------  1 bruno  staff  1675 Mar 29 17:03 id_rsa
-rw-r--r--  1 bruno  staff   416 Mar 29 17:03 id_rsa.pub

$ ssh-keygen -E md5 -lf id_rsa
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e [email protected] (RSA)

$ ssh-keygen -E md5 -lf id_rsa.pub
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e [email protected] (RSA)

Anda akan melihat bahwa Anda mendapatkan sidik jari yang sama untuk kunci privat dan publik.

Perintah yang sama dapat dikombinasikan dengan fitur rapi dari GitHub, yang merupakan fakta bahwa mereka secara publik melayani kunci publik SSH pengguna di https://github.com/<username>.keys

Berikut ini adalah one-liner yang dapat Anda gunakan untuk memanfaatkannya.

$ curl -sL https://github.com/RichardBronosky.keys | while read; do echo -e "\nkey #$((++i)):"; ssh-keygen -E md5 -lf - <<<"$REPLY"; echo $REPLY; done

key #1:
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJGT35gvsFveu+80qgurrLHId0h55E9jliM7Fo0mV9b7eg3EfyagkAcJUSMFkoov3HY4CW0yzOc7WlN57ABwvpRz1ioFDex0n0FkjoSEs5ROeT1OneRK6Bf6XnplgPuQ/LSSkv3kmK6I29R+YWi6TjDvLLoA5BrXJjOMfUv36jxWCDtk/5ZdhMZqhsMuDm06Jg5JBu6n5jQaZkmaIaunz7vOfwVG9LoCI+MYyIdo2S4VTva7Ee7jfAvgSUUgHTjhzsPO0/Ww5a/Kz2ehXW27aJxj/QPLfYR2LmTMbQKm3WpB8P1LjoiU7zjPoVoZ43a4P2JLUDidGKCd3eY5b5xewz

key #2:
2048 MD5:f7:98:f1:0b:73:c6:2a:21:00:7a:70:1d:0f:cf:d8:cc no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCQsZrjwKjB4WnE4SwVdDX5eEMxKzPHFBVKKpo9vvWUXRQwdTZy6iVOkyF26IPR+xDPzslzXOClKXUrWEh6La/EMpRwuMrWAbMIJFeDHOb56q4azgopoJmMJHo0yxGu0Ts4XszMACYRhlG6uK2AP5SYiOTp1zKPFjazXAdwLXyOvJurzy6KKuGJdSs/sj9+4uehgyRNOhehCSfg71tJJYwRvO2DDfLgaVEKOgZx58gEnJfhhz9D7rbvdZNhw/hCgtVNJaQF9Mdke2OPwWSo8i0/XNb9Bu/GRXqwMZrxDBhyzieocW40cwuzxWfzoi03aISdtQ1HtawH8+/sswviM1+B
Bruno Bronosky
sumber
1
ssh-keygen -r host.name.com

Akan menampilkan sidik jari untuk semua kunci publik yang dikonfigurasi pada instance sshd.

Ini kemudian dapat dimasukkan ke dalam catatan DNS SSHFP .

Mike Schroll
sumber