Dấu vân tay SHA256 ssh do khách hàng cung cấp nhưng chỉ có dấu vân tay md5 cho máy chủ


118

Khi kết nối với máy chủ mới / chưa biết (với OpenSSH gần đây), ví dụ:

ssh example.com

Bạn nhận được dấu vân tay như dưới đây:

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

Tuy nhiên, dấu vân tay thường được cung cấp cho máy chủ ở dạng này:

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

Làm cách nào tôi có thể kiểm tra tính xác thực (mà không làm phiền quản trị viên máy chủ để cung cấp dấu vân tay SHA256)?


Câu trả lời:


151

Trước đây, dấu vân tay đã được đưa ra dưới dạng băm md5 hexed. Bắt đầu với OpenSSH 6.8 , dấu vân tay hiện được hiển thị dưới dạng base64 SHA256 (theo mặc định). Bạn không thể so sánh chúng trực tiếp.

Họ cũng đã thêm một tùy chọn cấu hình mới FingerprintHash. Bạn có thể đặt

FingerprintHash md5

trong ~/.ssh/configđể hoàn nguyên về mặc định cũ ( kém an toàn hơn ) hoặc chỉ sử dụng tùy chọn này cho một lần sử dụng:

ssh -o FingerprintHash=md5 example.org

mà sẽ cho dấu vân tay như

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

Hy vọng quản trị viên máy chủ cung cấp cả hai loại dấu vân tay trong tương lai gần.

BIÊN TẬP:

Như được đưa ra trong các diễn đàn Arch Linux , cũng có một tùy chọn thứ ba:

Host example.org
    FingerprintHash md5

BIÊN TẬP:

Bạn có thể tạo hàm băm của một khóa tùy ý như được đưa ra trong OpenSSH Cookbook :

Lấy chìa khóa:

  • tải về với ssh-keyscan example.org > key.pub
  • hoặc: tìm các khóa trên máy chủ trong /etc/ssh

Tạo hàm băm:

  • đảm bảo bạn chỉ có một dòng / loại, vì vậy hãy xóa tất cả các dòng khác trong key.pubhoặc chạyssh-keyscan -t rsa example.org > key.pub
  • ssh-keygen -l -f key.pub (hàm băm mặc định, tùy thuộc vào phiên bản OpenSSH)
  • ssh-keygen -l -f key.pub -E md5 (md5 trên OpenSSH hiện tại)
  • awk '{print $2}' ssh_host_rsa_key.pub | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64 (sha256 trên OpenSSH cũ)
  • (Bạn có thể cần bắt đầu dòng với awk '{print $3}'các phiên bản mới hơn của ssh-keyscan vì định dạng đã thay đổi)

4
Bạn có biết làm thế nào tôi có thể lấy dấu vân tay sha256 trên máy chủ trong trường hợp tôi có quyền truy cập không? ssh-keygen -lf trên máy chủ chỉ cung cấp cho tôi bản in md5 và trong suốt cuộc đời tôi, tôi không thể tìm thấy cách lấy sha256 trong các trang của người đàn ông hoặc www cho đến nay ...
mã hóa

6
Tôi đã thêm một đoạn trích từ OpenSSH Cookbook bằng cách sử dụng sha256sum cho câu trả lời.
JonnyJD

2
cảm ơn bạn, bạn là người duy nhất đưa ra câu trả lời có giá trị thực sự.
Florian Heigl

1
Thật không may, tôi nhận được hàm băm SHA-256 khác khi sử dụng awk1 lớp lót của bạn (không khớp với hàm băm được hiển thị bởi khách hàng của tôi)
Jonathan Cross

2
sha256sum -b | awk '{print $1}' | xxd -r -pcó thể được thay thế bằng cách openssl sha256 -binarykhông yêu cầu cài đặt vim. Dòng lệnh kết quả sẽ là:awk '{print $2}' ~/.ssh/id_rsa.pub | base64 -d | openssl sha256 -binary | base64
Alexander Tumin

27

Chỉ cần tạo tập lệnh bash nhỏ sẽ in bảng bằng dấu vân tay cho tất cả các mật mã chính được phép trên máy chủ (theo /etc/ssh/sshd_config) trong cả SSH-256và thuật MD5toán. Đây là một ví dụ đầu ra:

 +---------+---------+-----------------------------------------------------+
 | 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 cũng sẽ chạy trên các máy chủ có SSHphiên bản bên dưới 6.8(trước khi -E md5tùy chọn được thêm vào).

Chỉnh sửa: Các phiên bản cập nhật cho các phiên bản SSH mới hơn thậm chí đã chuyển đổi mật mã mặc định ngay bây giờ với hỗ trợ hình ảnh 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

Đây chỉ là bản in đẹp sử dụng thông tin từ JonnyJDcâu trả lời của. Cảm ơn.


1
Tôi đã làm cho nó mạnh mẽ hơn và cải thiện chức năng một chút; phiên bản 0.3 (có thay đổi) tại đây: github.com/unixnut/scripts/blob/master/ssh_fprint Cảm ơn bạn đã viết bài này, thật tuyệt vời!
Alastair Irvine

6

Hóa ra ssh-keygen (đôi khi sau phiên bản 6.6; có lẽ là 6.8) có một -E md5tùy chọn sẽ khiến nó in ra dấu vân tay dưới dạng dấu vân tay md5. Vì vậy, nếu bạn có thể lấy độc lập tệp khóa công khai của máy chủ, bạn có thể đưa nó vào ssh-keygen -E md5 -l -f ssh_host_rsa_key.pubvà lấy dấu vân tay quen thuộc của mình.


2
tất cả điều đó đã có trong câu trả lời trước được định dạng tốt.
Jakuje

3

Các lớp lót sau hoạt động (ít nhất) trên Ubuntu 16.04,18.04 / Centos >= 7

(Đã thử nghiệm với máy chủ: 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-

Đầu ra:

# 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

đã cố gắng sửa đổi để có được nghệ thuật ngẫu nhiên vào bảng:

# 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

... nhưng tôi không phải là một lập trình viên thực sự và kịch bản không hoạt động như mong đợi. Sẽ đánh giá cao nếu bất cứ ai có thể giúp sửa chữa (cũng dọn dẹp). Sẽ rất tốt nếu có các hình ảnh nghệ thuật ngẫu nhiên sha256 và md5 cạnh nhau để sử dụng không gian hiệu quả hơn. Tôi cũng đã sửa đổi các lệnh md5 và sha256 vì các lệnh ban đầu không hoạt động đối với tôi (có lẽ là hệ thống quá mới) - chỉ sha256 xuất hiện trong bảng với dấu "=" ở cuối không phải là một phần của dấu vân tay thực tế và không thể xóa nó.

(xin lỗi tôi không thể bình luận khi tôi đăng ký gần đây)


Nếu bạn có một câu hỏi mới, vui lòng hỏi nó bằng cách nhấp vào nút Đặt câu hỏi . Bao gồm một liên kết đến câu hỏi này nếu nó giúp cung cấp bối cảnh.
Vịt Donald

Vâng - như bạn thấy - đó là một câu hỏi không mới nhưng thực sự thừa nhận rằng kịch bản được đề xuất không hoạt động như mong đợi và một phiên bản mới và vẫn chưa hoàn thành đã được đề xuất. Tôi có thể sửa đổi tập lệnh hiện có để nó hoạt động như mong đợi nhưng tôi đã cố gắng thêm nghệ thuật ngẫu nhiên và id phần này không hoàn thành. Trên thực tế, có một đề xuất làm thế nào để so sánh khóa công khai nhất định và khóa được cung cấp nhưng biến thể này không phải là bằng chứng MITM: ssh-keyscan -t ecdsa xxx.xxx.xxx.xxx | ssh-keygen -lv -f - && ssh -X -o VisualhostKey = yes -i ~ / .ssh / key user@xxx.xxx.xxx.xxx
zeroconf

Tôi không thấy ý kiến ​​của bạn nhưng hôm nay có cùng ý tưởng, vì vậy câu trả lời của tôi hiện được cập nhật với phiên bản làm việc cho các phiên bản OpenSSH gần đây, bao gồm cả nghệ thuật ASCII.
Kepi
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.