클라이언트가 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

이전에는 지문이 16 ​​진 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 forums에 주어진 것처럼 세 번째 옵션도 있습니다.

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을 얻는 방법을 찾을 수 없습니다 ...
Novling

6
sha256sum을 사용하여 OpenSSH Cookbook에서 스니핑을 추가했습니다.
JonnyJD

2
감사합니다. 실제 가치가있는 유일한 답변입니다.
Florian Heigl

1
불행히도 나는 awk1 라이너를 사용할 때 다른 SHA-256 해시를 얻습니다 (내 고객이 표시 한 해시와 일치하지 않음)
Jonathan Cross

2
sha256sum -b | awk '{print $1}' | xxd -r -popenssl sha256 -binaryvim을 설치하지 않아도 교체 할 수 있습니다 . 결과 명령 줄은 다음과 같습니다.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

편집 : ASCII 이미지 지원으로 기본 암호를 전환 한 최신 버전의 SSH 용 버전이 업데이트되었습니다.

#!/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
그 모든 것은 이미 이전 답변에 잘 정리되어 있습니다.
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

글쎄-당신이 보는 것처럼-새로운 질문은 아니지만 실제로 제안 된 스크립트가 예상대로 작동하지 않으며 아직 새롭고 아직 완전한 버전이 제안되지 않았다는 것을 인정합니다. 기존 스크립트를 수정하여 예상대로 작동 할 수 있지만 임의의 아트를 추가하려고했지만이 부분 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

나는 당신의 의견을 보지 못했지만 오늘 같은 생각을 얻었습니다. 제 답변은 ASCII 아트를 포함하여 최신 OpenSSH 버전의 작동 버전으로 업데이트되었습니다.
Kepi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.