題 由客戶端提供的SHA256 ssh指紋,但只有服務器知道的md5指紋


連接到新的/未知服務器(使用最近的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指紋)?


107
2018-06-18 14:18


起源




答案:


以前,指紋是作為hexed md5哈希給出的。 從...開始 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 (當前OpenSSH上的md5)
  • awk '{print $2}' ssh_host_rsa_key.pub | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64 (舊版OpenSSH上的sha256)
  • (您可能需要開始使用 awk '{print $3}' 對於較新版本的ssh-keyscan,因為格式已更改)

144
2018-06-18 14:18



你碰巧知道如何在服務器上獲取sha256指紋,以防我有權訪問嗎? ssh-keygen -lf  在服務器上只給我md5打印,並為我的生活我找不到如何在手冊頁或www到目前為止獲得sha256 ... - codeling
我使用sha256sum從OpenSSH Cookbook中添加了一個剪輯到答案。 - JonnyJD
謝謝你,你是唯一一個給出具有實際價值的答案的人。 - Florian Heigl
不幸的是,在使用你的時候我會得到一個不同的SHA-256哈希 awk 1行(與我的客戶端顯示的哈希不匹配) - Jonathan Cross
感謝您的註釋,有兩個潛在的問題:1)一些主機有多個密鑰,awk行只能使用一個2)最近版本的ssh-keyscan使用不同的格式,因此必須使用$ 3而不是$ 2。 (均通過編輯修復) - JonnyJD


剛剛創建的小bash腳本將打印帶有指紋的表,用於服務器上允許的所有密鑰密碼(根據 /etc/ssh/sshd_config) 同時 SSH-256 和 MD5 算法中。這是一個示例輸出:

 +---------+---------+-----------------------------------------------------+
 | 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現在使用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的答案。謝謝。


23
2018-01-24 21:23



我使它更強大,功能略有改進;版本0.3(帶有更改日誌)在這裡: github.com/unixnut/scripts/blob/master/ssh_fprint 感謝您寫這篇文章,真棒! - Alastair Irvine


事實證明,ssh-keygen(在版本6.6之後的某個時間;大概是6.8)有一個 -E md5 選項將導致它將指紋打印為md5指紋。因此,如果您可以獨立獲取服務器的公鑰文件,則可以將其提供給 ssh-keygen -E md5 -l -f ssh_host_rsa_key.pub 並獲得熟悉的指紋。


4
2018-01-08 06:29



所有這些都已經在之前的答案格式良好。 - Jakuje


試圖修改以獲得隨機藝術到表:

# 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在最後用“=”符號表示,這不是實際指紋的一部分,無法刪除它。

(抱歉,我最近註冊時無法發表評論)


0
2017-07-02 22:23



如果您有新問題,請點擊以查看 問問題 按鈕。如果有助於提供上下文,請包含此問題的鏈接。 - Donald Duck
好吧 - 如您所見 - 這是一個不是新問題,但實際上承認提議的腳本沒有按預期工作,並且已經提出了一個新的但仍未完成的版本。我可以修改現有腳本,以便它按預期工作,但我試圖添加隨機藝術,這部分ID不完整。實際上有一個提議如何比較某些公鑰和提供的密鑰,但這個變體不是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
我沒有看到你的評論,但今天有同樣的想法,所以我的答案現在更新為最近的OpenSSH版本的工作版本,包括ASCII藝術。 - Kepi


以下單線工作 Ubuntu 16.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-

0
2017-12-12 11:34