Sidik jari SHA256 ssh diberikan oleh klien tetapi hanya sidik jari md5 yang dikenal untuk server

118

Saat menghubungkan ke server baru / tidak dikenal (dengan OpenSSH terbaru), misalnya:

ssh example.com

Anda mendapatkan sidik jari seperti di bawah ini:

The authenticity of host 'example.org (192.0.2.42)' can't be established.
RSA key fingerprint is SHA256:7KMZvJiITZ+HbOyqjNPV5AeC5As2GSZES5baxy1NIe4.
Are you sure you want to continue connecting (yes/no)?

Namun, sidik jari biasanya diberikan untuk server dalam bentuk ini:

f6:fc:1c:03:17:5f:67:4f:1f:0b:50:5a:9f:f9:30:e5

Bagaimana saya bisa memeriksa keaslian (tanpa mengganggu admin server untuk memberikan sidik jari SHA256)?

JonnyJD
sumber

Jawaban:

151

Sebelumnya sidik jari diberikan sebagai hash md5 hexed. Dimulai dengan OpenSSH 6.8 sidik jari sekarang ditampilkan sebagai base64 SHA256 (secara default). Anda tidak dapat membandingkan ini secara langsung.

Mereka juga menambahkan opsi konfigurasi baru FingerprintHash. Anda bisa meletakkannya

FingerprintHash md5

di Anda ~/.ssh/configuntuk kembali ke default lama ( kurang aman ) atau cukup gunakan opsi ini untuk sekali pakai:

ssh -o FingerprintHash=md5 example.org

yang akan memberikan sidik jari sebagai

MD5:f6:fc:1c:03:17:5f:67:4f:1f:0b:50:5a:9f:f9:30:e5

Semoga admin server menyediakan kedua jenis sidik jari dalam waktu dekat.

SUNTING:

Seperti yang diberikan di forum Arch Linux , ada juga opsi ketiga:

Host example.org
    FingerprintHash md5

SUNTING:

Anda dapat menghasilkan hash kunci arbitrer seperti yang diberikan pada OpenSSH Cookbook :

Ambil kuncinya:

  • unduh kuncinya dengan ssh-keyscan example.org > key.pub
  • atau: cari kunci di server di /etc/ssh

Hasilkan hash:

  • pastikan Anda hanya memiliki satu baris / jenis, jadi hapus semua yang lain di key.pubatau jalankanssh-keyscan -t rsa example.org > key.pub
  • ssh-keygen -l -f key.pub (hash default, tergantung pada versi OpenSSH)
  • ssh-keygen -l -f key.pub -E md5 (md5 tentang OpenSSH saat ini)
  • awk '{print $2}' ssh_host_rsa_key.pub | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64 (sha256 pada OpenSSH lama)
  • (Anda mungkin perlu memulai baris dengan awk '{print $3}'untuk versi yang lebih baru dari ssh-keyscan karena formatnya berubah)
JonnyJD
sumber
4
apakah Anda tahu bagaimana saya bisa mendapatkan sidik jari sha256 di server jika saya memiliki akses di sana? ssh-keygen -lf pada server hanya memberi saya cetak md5, dan untuk kehidupan saya, saya tidak dapat menemukan cara mendapatkan sha256 baik di halaman manual atau www sejauh ini ...
codeling
6
Saya menambahkan potongan dari OpenSSH Cookbook menggunakan sha256sum untuk jawabannya.
JonnyJD
2
terima kasih, kaulah satu-satunya yang memberikan jawaban yang memiliki nilai sebenarnya.
Florian Heigl
1
Sayangnya saya mendapatkan hash SHA-256 yang berbeda saat menggunakan awk1-liner Anda (tidak cocok dengan hash yang ditunjukkan oleh klien saya)
Jonathan Cross
2
sha256sum -b | awk '{print $1}' | xxd -r -pdapat diganti dengan openssl sha256 -binarytidak memerlukan vim diinstal. Perintah yang dihasilkan adalah:awk '{print $2}' ~/.ssh/id_rsa.pub | base64 -d | openssl sha256 -binary | base64
Alexander Tumin
27

Hanya membuat skrip bash kecil yang akan mencetak tabel dengan sidik jari untuk semua kunci sandi yang diizinkan di server (sesuai dengan /etc/ssh/sshd_config) di keduanya SSH-256dan MD5algo. Berikut adalah contoh output:

 +---------+---------+-----------------------------------------------------+
 | Cipher  | Algo    | Fingerprint                                         |
 +---------+---------+-----------------------------------------------------+
 | RSA     | MD5     | MD5:15:66:80:fd:79:d8:c0:92:e8:39:4a:bc:4e:c4:00:15 |
 | RSA     | SHA-256 | SHA256:G+rKuLGk+8Z1oxUV3cox0baNsH0qGQWm/saWPr4qZMM  |
 +---------+---------+-----------------------------------------------------+
 | ECDSA   | MD5     | MD5:f5:90:5c:03:2e:38:1b:c9:86:bd:86:47:5d:22:79:17 |
 | ECDSA   | SHA-256 | SHA256:GGmuOzsG4EGeRV9KD1WK7tRf3nIc40k/5jRgbTZDpTo  |
 +---------+---------+-----------------------------------------------------+
 | ED25519 | MD5     | MD5:d1:5a:04:56:37:f4:75:19:22:e6:e5:d7:41:fd:79:fa |
 | ED25519 | SHA-256 | SHA256:QVdqYeVzvsP4n5yjuN3D2fu8hDhskOxQCQAV5f9QK7w  |
 +---------+---------+-----------------------------------------------------+

 +---[RSA 2048]----+ +---[RSA 2048]----+ +---[ECDSA 256]---+ +---[ECDSA 256]---+ +--[ED25519 256]--+ +--[ED25519 256]--+
 |.oE.   +.++      | |        .o+=     | |      ... Eoo    | |  .. o.o..      .| |        ooo++o.+*| |   .o++o. +oo    |
 |  .   o +oo.     | |        .o= =    | |     +.=.=.o .   | | . .o *..      ..| |       . oo.+o.o=| |      ...o.+     |
 |   + . . o.=     | |       ... X +   | |    . X.o.*      | |o o  ++o      .. | |        . o. ...+| |       ..oo.o .  |
 |    = +  .+ o    | |      ..  = + o  | |     + = o o     | |.+  .o.o     .o  | |         +    ..o| |        =oo .+   |
 |   o o .S  .     | |     . .S  o o   | |    . = S   .    | |...  oo.S  .E* * | |        S      ..| |       .SO .  .  |
 |    +            | |    . E. =o..    | |     o           | | .. o.  . o *.O o| |              .  | |        o B .o.. |
 |   o             | | .o. *.o. *.     | |                 | |   ...   . o * * | |               . | |         E *..=.o|
 |    .            | | oo=...  +.      | |                 | |    +.      o + o| |                E| |          . +.+B+|
 |                 | |o+=.o....o+o     | |                 | |   .o+         . | |                 | |           o.ooOX|
 +------[MD5]------+ +----[SHA256]-----+ +------[MD5]------+ +----[SHA256]-----+ +------[MD5]------+ +----[SHA256]-----+

Script akan berjalan juga di server dengan SSHversi di bawah ini 6.8(sebelum -E md5opsi ditambahkan).

Sunting: Versi yang diperbarui untuk versi SSH yang lebih baru lagi yang mengganti cipher standar sekarang dengan dukungan gambar ASCII.

#!/bin/bash
# server_ssh_fingerprints
#
# Version 0.2
#
# 2016 Kepi <[email protected]
# MIT License
#
# Print fingerprint matrix for all allowed Host Keys
# with all allowed ciphers and MD5 and SHA-256 algos
#
# Changelog:
#
# 2018-03-11 (0.2):
# - Support for newer versions of OpenSSH
# - Added visual keys for all algos too - only in recent OpenSSH versions

# standard sshd config path
SSHD_CONFIG=/etc/ssh/sshd_config

# helper functions
function tablize {
    awk '{printf(" | %-7s | %-7s | %-51s |\n", $1, $2, $3)}'
}
LINE=" +---------+---------+-----------------------------------------------------+"

# header
echo "$LINE"
echo "Cipher" "Algo" "Fingerprint" | tablize
echo "$LINE"

declare -A ALGOS
declare -a ASCII

# fingerprints
while read -r host_key; do
    cipher=$(echo "$host_key" | sed -r 's/^.*ssh_host_([^_]+)_key\.pub$/\1/'| tr 'a-z' 'A-Z')
    if [[ -f "$host_key" ]]; then
        if ssh-keygen -E md5 -l -f "$host_key" &>/dev/null; then
        IFS=$'\n'

        for algo in md5 sha256; do
            n=0
            for line in $(ssh-keygen -E $algo -lv -f "$host_key"); do
                n=$(( n + 1))
                if [[ $n -eq 1 ]]; then
                    ALGOS[$algo]=$(echo "$line" | awk '{print $2}')
                else
                    ASCII[$n]="${ASCII[$n]} ${line}"
                fi
            done
        done
        else
            ALGOS[md5]=$(ssh-keygen -l -f "$host_key" | awk '{print $2}')
            ALGOS[sha256]=$(awk '{print $2}' "$host_key" | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64)
        fi

        echo "$cipher" MD5 "${ALGOS[md5]}" | tablize
        echo "$cipher" SHA-256 "${ALGOS[sha256]}" | tablize
        echo "$LINE"
    fi
 done < <(awk '/^HostKey/ {sub(/^HostKey\s+/,"");print $0".pub"};' $SSHD_CONFIG)

echo
for line in "${ASCII[@]}"; do
    echo "$line"
done

Ini hanya cukup cetak menggunakan informasi dari JonnyJDjawaban. Terima kasih.

Kepi
sumber
1
Saya membuatnya lebih kuat dan sedikit meningkatkan fungsionalitas; versi 0.3 (dengan changelog) di sini: github.com/unixnut/scripts/blob/master/ssh_fprint Terima kasih telah menulis ini, ini luar biasa!
Alastair Irvine
6

ternyata ssh-keygen (beberapa saat setelah versi 6.6; mungkin 6.8) memiliki -E md5opsi yang akan membuatnya mencetak sidik jari sebagai sidik jari md5. Jadi, jika Anda dapat secara independen mengambil file kunci publik dari server, Anda dapat mengumpankannya ke ssh-keygen -E md5 -l -f ssh_host_rsa_key.pubdan mendapatkan sidik jari yang Anda kenal.

Greg Minshall
sumber
2
semua itu sudah ada di jawaban sebelumnya yang diformat dengan baik.
Jakuje
3

One-liner berikut berfungsi (setidaknya) pada Ubuntu 16.04,18.04 / Centos >= 7

(Diuji dengan server: openssh 3.9- openssh 7.4)

ssh-keygen -l -E md5 -f <(ssh-keyscan -t rsa 192.168.2.1) \
| awk '{print $2}' | cut -d":" -f 2-

Keluaran:

# 192.168.2.1:22 SSH-2.0-OpenSSH_5.3
65:2c:c4:03:03:2f:6d:c0:c0:09:79:e7:33:c4:f1:78
Marinos An
sumber
1

mencoba memodifikasi untuk memasukkan seni acak ke dalam tabel:

# standard sshd config path
SSHD_CONFIG=/etc/ssh/sshd_config

# helper functions
function tablize {
        awk '{printf("| %-7s | %-51s |\n", $1, $3)}'
}
LINE="+---------+-----------------------------------------------------+"

# header
echo $LINE
echo "Cipher" "Fingerprint" "Fingerprint" | tablize
echo $LINE

# fingerprints
for host_key in $(awk '/^HostKey/ {sub(/^HostKey\s+/,"");print $0".pub"};' $SSHD_CONFIG); do
        cipher=$(echo $host_key | sed -r 's/^.*ssh_host_([^_]+)_key\.pub$/\1/'| tr '[a-z]' '[A-Z]')
        if [[ -f "$host_key" ]]; then
                md5=$(ssh-keygen -l -f $host_key -E md5 | awk '{print $2}')
                sha256=$(ssh-keygen -l -f $host_key | awk '{print $2}')
                art_sha256=$(ssh-keygen -lv -f $host_key | grep -v -w "256 SHA256" | grep -v -w "1024 SHA256" | grep -v -w "2048 SHA256")
                art_md5=$(ssh-keygen -lv -f $host_key -E md5 | grep -v "256 MD5" | grep -v "1024 MD5" | grep -v "2048 MD5")

                echo $cipher MD5 $md5 | tablize
                echo $cipher SHA-256 $sha256 | tablize
                echo $art_sha256 | tablize
                echo $art_md5 | tablize
                echo $LINE
        fi
done

... tapi saya bukan programmer sebenarnya dan skrip tidak berfungsi seperti yang diharapkan. Akan menghargai jika ada yang bisa membantu memperbaiki (juga pembersihan). Akan menyenangkan untuk memiliki sha256 dan md5 gambar seni acak berdampingan untuk menggunakan ruang lebih efisien. Saya juga memodifikasi perintah md5 dan sha256 karena yang asli tidak berfungsi untuk saya (mungkin sistem yang terlalu baru) - hanya sha256 yang dimasukkan ke dalam tabel dengan tanda "=" di bagian akhir yang bukan bagian dari sidik jari aktual dan tidak dapat menghapusnya.

(maaf saya tidak bisa berkomentar karena saya mendaftar baru-baru ini)

zeroconf
sumber
Jika Anda memiliki pertanyaan baru, silakan tanyakan dengan mengklik tombol Ajukan Pertanyaan . Sertakan tautan ke pertanyaan ini jika itu membantu menyediakan konteks.
Donald Duck
Yah - seperti yang Anda lihat - ini bukan pertanyaan baru tetapi sebenarnya mengakui bahwa skrip yang diajukan tidak berfungsi seperti yang diharapkan dan versi yang baru dan masih belum lengkap telah diusulkan. Saya dapat memodifikasi skrip yang ada sehingga berfungsi seperti yang diharapkan, tetapi saya mencoba menambahkan seni acak dan id bagian ini tidak lengkap. Sebenarnya ada satu proposal bagaimana membandingkan kunci publik tertentu dan kunci yang ditawarkan tetapi varian ini bukan MITM-proof: ssh-keyscan -t ecdsa xxx.xxx.xxx.xxx | ssh-keygen -lv -f - && ssh -X -o VisualHostKey = yes -i ~ / .ssh / key [email protected]
zeroconf
Saya tidak melihat komentar Anda tetapi hari ini mendapat ide yang sama, jadi jawaban saya sekarang diperbarui dengan versi yang berfungsi untuk versi OpenSSH yang lebih baru, termasuk seni ASCII.
Kepi