たとえば、最近の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フィンガープリントを提供するためにサーバー管理者に盗むことなく)。
以前は、フィンガープリントは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フォーラム にあるように、3番目の選択肢もあります:
Host example.org
FingerprintHash md5
編集:
OpenSSHクックブック で与えられているように、任意のキーのハッシュを生成することができます。
キーを取得します。
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}'
で始める必要があるかもしれません)/etc/ssh/sshd_config
およびSSH-256
algoの両方で、サーバー上で許可されているすべての鍵暗号のフィンガープリント付きのテーブルを(MD5
に従って)印刷する小さなbashスクリプトを作成しました。出力例はここにあります:
+---------+---------+-----------------------------------------------------+
| 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]-----+
6.8
より下のSSH
バージョンのサーバーでもスクリプトは実行されます(-E md5
オプションが追加される前)。
編集:ASCII画像をサポートするようにデフォルト暗号を切り替えたSSHのさらに新しいバージョン用に更新されたバージョン。
#!/bin/bash
# server_ssh_fingerprints
#
# Version 0.2
#
# 2016 Kepi <[email protected]
# 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
の答えからの情報を使った単なるきれいな印刷です。ありがとう。
ssh-keygen(バージョン6.6以降、おそらく6.8以降)には-E md5
オプションがあります。これにより、フィンガープリントがmd5フィンガープリントとして出力されます。そのため、サーバーの公開鍵ファイルを独自に取得できる場合は、それをssh-keygen -E md5 -l -f ssh_Host_rsa_key.pub
に渡して、よく知られている指紋を取得できます。
以下のワンライナーは(少なくとも)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
ランダムアートもテーブルに入れるように修正しようとしました:
# 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だけで、実際のフィンガープリントの一部ではなく削除できません。
(最近登録したのでコメントできませんでした)