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指纹)?
#1 楼
以前,指纹是作为十六进制的md5哈希值给出的。从OpenSSH 6.8开始,指纹现在显示为base64 SHA256(默认情况下)。
您不能直接比较它们。
他们还添加了一个新的配置选项
FingerprintHash
。您可以在您的
~/.ssh/config
中放入FingerprintHash md5
,以恢复为旧的(不太安全)默认值或将此选项用于单次使用:
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 }' ssh_host_rsa_key.pub | base64 -d | sha256sum -b | awk '{print }' | xxd -r -p | base64
(旧OpenSSH上的sha256)(对于新版本,您可能需要以
awk '{print }'
开始ssh-keyscan的原因是格式已更改)评论
您是否偶然知道如何在我可以访问服务器的情况下在服务器上获取sha256指纹?服务器上的ssh-keygen -lf只给我md5打印,对于我一生来说,到目前为止,我都找不到如何在手册页或www中获得sha256的方法。
–编码
2015年11月12日在21:09
我将使用sha256sum的OpenSSH Cookbook中的片段添加到了答案中。
–JonnyJD
2015年11月13日,0:33
谢谢,您是唯一给出具有实际价值的答案的人。
–弗洛里安·海格尔(Florian Heigl)
16年4月12日在12:39
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)
19年5月28日在13:29
@JonathanCross请注意,base64实用程序会产生填充的输出(即可能以一或两个等号结尾),而openssh客户端不会在其日志中填充base64。
–亚历山大·图敏(Alexander Tumin)
19年5月28日在13:31
#2 楼
刚刚创建了一个小的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", , , )}'
}
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$//'| 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 }')
else
ASCII[$n]="${ASCII[$n]} ${line}"
fi
done
done
else
ALGOS[md5]=$(ssh-keygen -l -f "$host_key" | awk '{print }')
ALGOS[sha256]=$(awk '{print }' "$host_key" | base64 -d | sha256sum -b | awk '{print }' | 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 JonnyJD
".pub"};' $SSHD_CONFIG)
echo
for line in "${ASCII[@]}"; do
echo "$line"
done
使用来自q4312079q的答案的信息,这只是漂亮的印刷品。谢谢。
评论
我使它更加健壮,并稍微改进了功能;版本0.3(带有changelog)在这里:github.com/unixnut/scripts/blob/master/ssh_fprint感谢您撰写本文,它很棒!
–阿拉斯泰尔·欧文(Alastair Irvine)
18年4月29日在14:57
@kepi感谢您的脚本,我过去曾使用过几次,但是现在无法正常工作了,所以我做了自己的版本,并将其发布为新答案(请查看,可能在下面...)。
– loco.loop
20 Mar 14 '22:02
#3 楼
事实证明,ssh-keygen(在6.6版之后;大概是6.8版之后)具有-E md5
选项,这将导致它以md5指纹的形式打印出指纹。因此,如果您可以独立获取服务器的公钥文件,则可以将其提供给ssh-keygen -E md5 -l -f ssh_host_rsa_key.pub
并获取熟悉的指纹。评论
所有这些都已经在前面的答案中格式化了。
–贾库耶
16年1月8日在16:25
#4 楼
以下单行代码(至少)可用于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 }' | 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
#5 楼
试图进行修改以使随机图也进入表中:# standard sshd config path
SSHD_CONFIG=/etc/ssh/sshd_config
# helper functions
function tablize {
awk '{printf("| %-7s | %-51s |\n", , )}'
}
LINE="+---------+-----------------------------------------------------+"
# header
echo $LINE
echo "Cipher" "Fingerprint" "Fingerprint" | tablize
echo $LINE
# fingerprints
for host_key in $(awk '/^HostKey/ {sub(/^HostKey\s+/,"");print q4312078q".pub"};' $SSHD_CONFIG); do
cipher=$(echo $host_key | sed -r 's/^.*ssh_host_([^_]+)_key\.pub$//'| tr '[a-z]' '[A-Z]')
if [[ -f "$host_key" ]]; then
md5=$(ssh-keygen -l -f $host_key -E md5 | awk '{print }')
sha256=$(ssh-keygen -l -f $host_key | awk '{print }')
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在表中最后加上“ =”符号,这不是实际指纹的一部分,无法删除。
(对不起,我最近注册时无法发表评论)
评论
如果您有新问题,请单击“提问”按钮提问。如果它有助于提供上下文,请包括指向该问题的链接。
–唐老鸭
17年7月3日,0:18
嗯-如您所见-这不是一个新问题,但实际上是承认所提议的脚本没有按预期工作,并且已经提出了一个新的但仍未完成的版本。我可以修改现有脚本,以使其按预期工作,但是我尝试添加随机图片,并且此部件ID不完整。实际上,有一个建议是如何比较某些公用密钥和提供的密钥,但是此变体不是MITM认证的:ssh-keyscan -t ecdsa xxx.xxx.xxx.xxx | ssh-keygen -lv -f-&& ssh -X -o VisualHostKey =是-i〜/ .ssh / key user@xxx.xxx.xxx.xxx
– zeroconf
17年7月3日在17:36
我没有看到您的评论,但是今天有了相同的主意,因此我的答案现已更新为工作版本,以获取最新的OpenSSH版本(包括ASCII艺术作品)。
– Kepi
18 Mar 11 '18 at 19:55
#6 楼
我喜欢Kepi的想法,但不幸的是,这对我不起作用了,因此我查看了脚本并使其起作用,并且我简化了该脚本并删除了ASCII艺术,因为我不需要它。运行我的脚本脚本直接运行:
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"
}
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 }' | sed 's/^[^:]*://g')
sha256=$(echo $sha256_result | awk '{print }' | sed 's/^[^:]*://g')
tablize $cipher MD5 $md5
tablize $cipher SHA-256 $sha256
echo $LINE
done
评论
相关文章在新版本的openssh上以(旧)十六进制格式获取SSH密钥指纹。