ลายนิ้วมือ SHA256 ssh กำหนดโดยไคลเอนต์ แต่มีลายนิ้วมือ md5 เท่านั้นที่รู้จักสำหรับเซิร์ฟเวอร์


118

เมื่อเชื่อมต่อกับเซิร์ฟเวอร์ใหม่ / ไม่รู้จัก (ด้วย OpenSSH ล่าสุด) ตัวอย่างเช่น:

ssh example.com

คุณได้รับลายนิ้วมือด้านล่าง:

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)?

อย่างไรก็ตามลายนิ้วมือมักจะมอบให้กับเซิร์ฟเวอร์ในรูปแบบนี้:

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

ฉันจะตรวจสอบความถูกต้องได้อย่างไร (โดยไม่ต้องบั๊กผู้ดูแลระบบเซิร์ฟเวอร์เพื่อระบุลายนิ้วมือ SHA256)


คำตอบ:


151

ก่อนหน้านี้มีการระบุลายนิ้วมือเป็น hex md5 hash เริ่มต้นด้วยOpenSSH 6.8ตอนนี้ลายนิ้วมือจะปรากฏเป็น base64 SHA256 (โดยค่าเริ่มต้น) คุณไม่สามารถเปรียบเทียบได้โดยตรง

FingerprintHashพวกเขายังเพิ่มตัวเลือกการกำหนดค่าใหม่ คุณสามารถใส่

FingerprintHash md5

ใน~/.ssh/configการเปลี่ยนกลับเป็นค่าเริ่มต้นเก่า ( ปลอดภัยน้อยกว่า ) หรือใช้ตัวเลือกนี้เพียงครั้งเดียว:

ssh -o FingerprintHash=md5 example.org

ซึ่งจะให้ลายนิ้วมือเป็น

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

หวังว่าผู้ดูแลระบบเซิร์ฟเวอร์จะให้ลายนิ้วมือทั้งสองประเภทในอนาคตอันใกล้นี้

แก้ไข:

ตามที่ระบุไว้ในฟอรัม Arch Linuxนอกจากนี้ยังมีตัวเลือกที่สาม:

Host example.org
    FingerprintHash md5

แก้ไข:

คุณสามารถสร้างแฮชของคีย์ใดก็ได้ตามที่กำหนดในOpenSSH Cookbook :

ดึงกุญแจ:

  • ดาวน์โหลดกุญแจด้วย ssh-keyscan example.org > key.pub
  • หรือ: ค้นหากุญแจบนเซิร์ฟเวอร์ใน /etc/ssh

สร้างแฮช:

  • ตรวจสอบให้แน่ใจว่าคุณมีหนึ่งบรรทัด / ประเภทเดียวดังนั้นให้ลบคนอื่น ๆ ทั้งหมดในkey.pubหรือเรียกใช้ssh-keyscan -t rsa example.org > key.pub
  • ssh-keygen -l -f key.pub (แฮชเริ่มต้นขึ้นอยู่กับรุ่น OpenSSH)
  • ssh-keygen -l -f key.pub -E md5 (md5 บน OpenSSH ปัจจุบัน)
  • awk '{print $2}' ssh_host_rsa_key.pub | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64 (sha256 กับ OpenSSH เก่า)
  • (คุณอาจต้องเริ่มบรรทัดด้วยawk '{print $3}'สำหรับ ssh-keyscan เวอร์ชันใหม่เนื่องจากรูปแบบมีการเปลี่ยนแปลง)

4
คุณรู้หรือไม่ว่าฉันจะใช้ลายนิ้วมือ sha256 บนเซิร์ฟเวอร์ได้อย่างไรในกรณีที่ฉันเข้าถึงที่นั่น? ssh-keygen -lf บนเซิร์ฟเวอร์ทำให้ฉันพิมพ์ md5 เท่านั้นและสำหรับชีวิตของฉันฉันไม่สามารถหาวิธีที่จะได้รับ sha256 อย่างใดอย่างหนึ่งในหน้าคนหรือ www จนถึง ...
codeling

6
ฉันเพิ่ม snipped จาก OpenSSH Cookbook โดยใช้ sha256sum ในคำตอบ
JonnyJD

2
ขอบคุณคุณเป็นคนเดียวที่ให้คำตอบที่มีคุณค่าจริง
Florian Heigl

1
น่าเสียดายที่ฉันได้รับกัญชา SHA-256 ที่แตกต่างกันเมื่อใช้awk1 ซับของคุณ(ไม่ตรงกับแฮชที่ลูกค้าของฉันแสดง)
Jonathan Cross

2
sha256sum -b | awk '{print $1}' | xxd -r -pสามารถถูกแทนที่โดยopenssl sha256 -binaryไม่ต้องติดตั้ง vim ผลลัพธ์ของ commandline คือ:awk '{print $2}' ~/.ssh/id_rsa.pub | base64 -d | openssl sha256 -binary | base64
Alexander Tumin

27

เพิ่งสร้างสคริปต์ทุบตีเล็ก ๆ ซึ่งจะพิมพ์ตารางที่มีลายนิ้วมือสำหรับการเข้ารหัสที่สำคัญทั้งหมดที่ได้รับอนุญาตบนเซิร์ฟเวอร์ (ตาม/etc/ssh/sshd_config) ทั้งในSSH-256และMD5algo นี่คือตัวอย่างเอาต์พุต:

 +---------+---------+-----------------------------------------------------+
 | 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]-----+

สคริปต์จะทำงานบนเซิร์ฟเวอร์ที่มีSSHเวอร์ชันด้านล่าง6.8(ก่อน-E md5เพิ่มตัวเลือก)

แก้ไข: เวอร์ชันที่อัปเดตสำหรับ SSH เวอร์ชันล่าสุดยิ่งขึ้นซึ่งเปลี่ยน ciphers เริ่มต้นทันทีด้วยการสนับสนุนอิมเมจ ASCII

#!/bin/bash
# server_ssh_fingerprints
#
# Version 0.2
#
# 2016 Kepi <kepi@igloonet.cz
# 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

นี่เป็นเพียงแค่พิมพ์สวยโดยใช้ข้อมูลจากJonnyJDคำตอบของ ขอบคุณ


1
ฉันทำให้มันแข็งแกร่งขึ้นและปรับปรุงการทำงานเล็กน้อย เวอร์ชั่น 0.3 (พร้อมการเปลี่ยนแปลง) ที่นี่: github.com/unixnut/scripts/blob/master/ssh_fprintขอขอบคุณที่เขียนสิ่งนี้มันยอดเยี่ยมมาก!
Alastair Irvine

6

มันกลับกลายเป็น ssh-keygen (บางครั้งหลังจากรุ่น 6.6, สันนิษฐานว่า 6.8) มี-E md5ตัวเลือกที่จะทำให้มันพิมพ์ลายนิ้วมือเป็นลายนิ้วมือ md5 ดังนั้นหากคุณสามารถคว้าไฟล์กุญแจสาธารณะของเซิร์ฟเวอร์คุณสามารถป้อนssh-keygen -E md5 -l -f ssh_host_rsa_key.pubและรับลายนิ้วมือที่คุณคุ้นเคย


2
ทั้งหมดนี้มีอยู่แล้วในคำตอบก่อนหน้านี้ในรูปแบบที่ดี
Jakuje

3

หนึ่งซับต่อไปนี้ใช้งานได้ (อย่างน้อย) บน Ubuntu 16.04,18.04 / Centos >= 7

(ทดสอบกับเซิร์ฟเวอร์: 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-

เอาท์พุท:

# 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

1

พยายามที่จะแก้ไขเพื่อให้ได้งานศิลปะแบบสุ่มลงในตาราง:

# 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

... แต่ฉันไม่ใช่โปรแกรมเมอร์จริง ๆ แล้วสคริปต์ไม่ทำงานอย่างที่คาดไว้ จะขอบคุณถ้าใครสามารถช่วยแก้ไข (เช่นล้าง) คงจะดีถ้ามี sha256 และ md5 สุ่มภาพศิลปะเคียงข้างกันเพื่อใช้พื้นที่ได้อย่างมีประสิทธิภาพมากขึ้น ฉันยังแก้ไขคำสั่ง md5 และ sha256 เนื่องจากคำสั่งเดิมไม่ทำงานสำหรับฉัน (อาจเป็นระบบใหม่เกินไป) - มีเพียง sha256 เท่านั้นที่ปรากฏในตารางที่มีเครื่องหมาย "=" ในตอนท้ายซึ่งไม่ได้เป็นส่วนหนึ่งของลายนิ้วมือจริงและไม่สามารถลบออกได้

(ขออภัยฉันไม่สามารถแสดงความคิดเห็นเมื่อฉันลงทะเบียนเมื่อเร็ว ๆ นี้)


หากคุณมีคำถามใหม่โปรดขอได้โดยคลิกที่ถามคำถามปุ่ม รวมลิงค์ไปยังคำถามนี้หากช่วยระบุบริบท
Donald Duck

อย่างที่คุณเห็นมันเป็นคำถามที่ไม่ใหม่ แต่จริงๆแล้วยอมรับว่าสคริปต์ที่เสนอนั้นไม่ทำงานตามที่คาดไว้และมีการเสนอเวอร์ชันใหม่และยังไม่เสร็จสมบูรณ์ ฉันสามารถแก้ไขสคริปต์ที่มีอยู่เพื่อให้ทำงานได้ตามที่คาดไว้ แต่ฉันพยายามเพิ่มงานศิลปะแบบสุ่มและรหัสชิ้นนี้ไม่สมบูรณ์ จริงๆแล้วมีข้อเสนอเพียงวิธีเดียวที่จะเปรียบเทียบกุญแจสาธารณะบางอันและคีย์ที่เสนอได้ แต่ตัวแปรนี้ไม่ได้พิสูจน์ว่า MITM: ssh-keyscan -t ecdsa xxx.xxx.xxx.xxx | ssh-keygen -lv -f - && ssh -X -o VisualHostKey = ใช่ -i ~ / .ssh / แป้น user@xxx.xxx.xxx.xxx.xxx
zeroconf

ฉันไม่เห็นความคิดเห็นของคุณ แต่วันนี้มีแนวคิดเดียวกันดังนั้นคำตอบของฉันจึงได้รับการอัปเดตด้วยเวอร์ชันการทำงานสำหรับเวอร์ชัน OpenSSH ที่ใหม่กว่ารวมถึง ASCII art
Kepi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.