openssh – SHA256 ssh のフィンガープリントがクライアントから与えられるが、サーバでは md5 のフィンガープリントしか知られていない

openssh ssh

新規/未知のサーバ(最近の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フィンガープリントを提供するようなことはしないでください)?

  128  JonnyJD  2015-06-18


ベストアンサー

以前は指紋は 16 進数の md5 ハッシュで表示されていました。OpenSSH 6.8 以降、フィンガープリントは base64 SHA256 (デフォルト) で表示されるようになりました。これらを直接比較することはできません

また、新しい設定オプション FingerprintHash を追加してくれました。を入れることができます

FingerprintHash md5

~/.ssh/config で、古い (less secure) デフォルトに戻すか、このオプションを単独で使用するかを選択します

ssh -o FingerprintHash=md5 example.org

これは指紋を

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

うまくいけば、サーバー管理者は近い将来、両方のタイプの指紋を提供することができます

EDIT:

Arch Linux forums で与えられているように、第三の選択肢もあります

Host example.org
FingerprintHash md5

EDIT:

OpenSSH クックブック で与えられているように、任意のキーのハッシュを生成することができます

キーを取得します

  • ssh-keyscan example.org > key.pubで鍵をダウンロードします
  • または: /etc/sshでサーバ上の鍵を探す

ハッシュを生成します

  • 1つの行/型しかないことを確認して、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)
  • (新しいバージョンの ssh-keyscan ではフォーマットが変更されたため、行の先頭を awk '{print $3}' で始める必要があるかもしれません)

162  JonnyJD  2015-06-18


SSH-256MD5 の両方のアルゴで、サーバ上で許可されているすべての鍵暗号のフィンガープリントを表示する小さな bash スクリプトを作成しました (/etc/ssh/sshd_config によると)。以下に出力例を示します

 +---------+---------+-----------------------------------------------------+
| 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さんの回答の情報を利用したきれいなプリントに過ぎません。ありがとうございます

28  Kepi  2016-01-24


ssh-keygen (バージョン 6.6 以降のいつかの時期; おそらく 6.8) には -E md5 オプションがあり、これを使うと md5 の指紋として指紋を印刷することができます。つまり、サーバの公開鍵ファイルを独立して取得することができれば、それを ssh-keygen -E md5 -l -f ssh_host_rsa_key.pub に渡して、おなじみの指紋を取得することができます

7  Greg Minshall  2016-01-08


以下のワンライナーはUbuntu 16.04,18.04 / Centos >= 7で(少なくとも)機能します

(サーバでテスト済み: openssh 3.9openssh 7.4)

ssh-keygen -l -E md5 -f <(ssh-keyscan -t rsa 192.168.2.1) \
| awk '{print $2}' | cut -d":" -f 2-

Output:

# 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

3  Marinos An  2017-12-12


ランダムアートもテーブルに入るように修正してみました

# 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 だけが最後に “=” 記号が付いたテーブルに現れましたが、これは実際の指紋の一部ではなく、削除することはできませんでした

(最近登録したのでコメントできなくてすみません)

1  zeroconf  2017-07-02


私はKepiさんのアイデアが好きだったのですが、残念ながらそれはもう私には通用しないので、スクリプトを見直して動作させました

私のスクリプトを直接実行するには

curl -sS https://raw.githubusercontent.com/caballerofelipe/scripts/master/ssh/ssh_fingerprint.sh | bash

以下は私のスクリプトです(GitHubで将来的に変更されるかもしれません)

#!/bin/bash

# To run this file directly from a computer without downloading run this:
# curl -sS https://raw.githubusercontent.com/caballerofelipe/scripts/master/ssh/ssh_fingerprint.sh | bash

# Used to show SSH fingerprints
# Inspired by this post: http://superuser.com/a/1030779/369045

# standard sshd config path
SSH_DIR=/etc/ssh/

# Helper functions
function tablize {
printf "| %-7s | %-7s | %-47s |\n" $1 $2 $3
}
LINE="+---------+---------+-------------------------------------------------+"

# Header
echo $LINE
tablize "Cipher" "Algo" "Fingerprint"
echo $LINE

# Fingerprints
for i in $(ls $SSH_DIR/*.pub); do
md5_result=$(ssh-keygen -l -f $i -E md5)
sha256_result=$(ssh-keygen -l -f $i -E sha256)
cipher=$(echo $md5_result | sed 's/.*(//' | sed 's/)[^)]*//')
md5=$(echo $md5_result | awk '{print $2}' | sed 's/^[^:]*://g')
sha256=$(echo $sha256_result | awk '{print $2}' | sed 's/^[^:]*://g')
tablize $cipher MD5 $md5
tablize $cipher SHA-256 $sha256
echo $LINE
done

1  loco.loop  2020-03-14


タイトルとURLをコピーしました