客户端提供的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指纹)?


Answers:


151

以前,指纹是作为十六进制的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的较新版本开始该行)

4
您是否偶然知道如何在我可以访问服务器的情况下在服务器上获取sha256指纹?ssh-keygen -lf 在服务器上只给了我md5打印信息,而对于我一生来说,我找不到如何在手册页或www上获得sha256的代码...
编码

6
我将使用sha256sum的OpenSSH Cookbook中的片段添加到了答案中。
JonnyJD 2015年

2
谢谢,您是唯一给出具有实际价值的答案的人。
Florian Heigl

1
不幸的是,在使用您的awk1-liner 时,我得到了一个不同的SHA-256哈希值(与我的客户显示的哈希值不匹配)
Jonathan Cross

2
sha256sum -b | awk '{print $1}' | xxd -r -p可以通过openssl sha256 -binary不需要安装vim 来替换。结果命令行将是:awk '{print $2}' ~/.ssh/id_rsa.pub | base64 -d | openssl sha256 -binary | base64
Alexander Tumin

27

刚刚创建了一个小型的bash脚本,该脚本将为服务器和算法中的服务器(根据/etc/ssh/sshd_config)打印所有带有指纹的指纹表。这是示例输出:SSH-256MD5

 +---------+---------+-----------------------------------------------------+
 | 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答案的信息,这只是漂亮的印刷品。谢谢。


1
我使它更加健壮,并稍微改善了功能。版本0.3(带有changelog)在这里: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
所有这些都已经在前面的答案中格式化了。
雅库耶

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分配到表中,最后带有“ =”符号,这不是实际指纹的一部分,因此无法删除。

(对不起,我最近注册时无法发表评论)


如果您有新问题,请单击“ 提问”按钮提问。如果它有助于提供上下文,请包括指向该问题的链接。
唐老鸭

嗯-正如您所看到的-这不是一个新问题,但实际上是承认所提议的脚本没有按预期工作,并且已经提出了一个新的但仍未完成的版本。我可以修改现有脚本,以使其按预期工作,但是我尝试添加随机图片,并且此部件ID不完整。实际上,有一个建议是如何比较某些公用密钥和提供的密钥,但是此变体不是MITM认证的:ssh-keyscan -t ecdsa xxx.xxx.xxx.xxx | SSH-密钥生成-lv -f - && SSH -X -o VisualHostKey = YES -i的〜/ .ssh /键user@xxx.xxx.xxx.xxx
零配置

我没有看到您的评论,但是今天有了相同的主意,因此我的答案现已更新为可用的版本,以更新的OpenSSH版本,包括ASCII艺术。
Kepi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.