我总是在将ssh插入新计算机时收到以下消息:

12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53


代表什么?每个机器每次都具有相同的指纹吗?

这些指纹是如何生成的?它们依赖什么参数?

#1 楼

指纹基于主机的公钥,通常基于“ /etc/ssh/ssh_host_rsa_key.pub”。
一般来说,其指纹易于识别/验证要连接的主机。

如果指纹发生变化,则说明您所连接的机器已更改了其公钥。这可能不是一件坏事(发生在重新安装ssh的情况下),但也可能表示您正在连接到同一域/ IP上的另一台计算机(发生在通过负载平衡器进行连接时发生)或被中间人攻击作为目标,攻击者以某种方式拦截/重新路由您的ssh连接以连接到可能监听您的用户/密码的其他主机。

底线:如果警告您指纹已更改,请谨慎并仔细检查您是否实际上已通过安全连接连接到正确的主机。尽管大多数情况下这是无害的,但这可能表明存在潜在的问题。

请参阅:http://www.lysium.de/blog/index.php?/archives/186-如何-to-get-ssh-server-fingerprint-information.html
和:http://en.wikipedia.org/wiki/Public_key_fingerprint

评论


“……要谨慎并仔细检查您是否实际上已通过安全连接连接到正确的主机” –愚蠢的问题,但是如何轻松地做到这一点?

–萨瓦拉
2015年8月10日上午11:00

@Savara当您连接到以前没有连接过的SSH服务器时,应从服务器管理员那里请求SSH服务器的公钥。服务器管理员将为您提供一段文字。您应该将此文本附加到文件〜/ .ssh / known_hosts。这样,当您连接到服务器时,您的SSH客户端将可以识别该服务器,因为您已将其公钥保存到known_hosts。因此,实际上,当SSH客户端告诉您“无法建立主机的真实性”时,您永远不要说“是”。您应该始终预先添加服务器的公钥。

– Utku
17 Mar 24 '17在06:06

@Savara如果这样做,当您的SSH客户端告诉您“无法建立客户端的真实性”或告诉您“服务器的公共密钥已更改”时,您将发现有些麻烦。因此,您应该始终始终将服务器的公钥预先添加到〜/ .ssh / known_hosts文件中,并且当SSH客户端告诉您“客户端的真实性无法建立”或告诉您“公共密码”时,永远不要说是。服务器的密钥已更改”。

– Utku
17年3月24日在16:09

是的,我完全了解查看SSH指纹的机制是如何工作的,但是大部分时间您无法选择通过其他渠道获取指纹。可悲的是,豆腐是我们经常得到的最好的。

–萨瓦拉
17 Mar 25 '17:55



即使回答“是”,有没有办法检查真实性?

–兑换
18年3月3日在11:27

#2 楼

您可以使用ssh-keygen像这样为公共密钥生成指纹:

ssh-keygen -lf /path/to/key.pub


具体示例(如果使用RSA公共密钥):

$ ssh-keygen -lf ~/.ssh/id_rsa.pub
2048 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff /Users/username/.ssh/id_rsa.pub (RSA)


第一部分(2048)是密钥长度(以位为单位),第二部分(00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)是公共密钥的指纹,第三部分是公共密钥文件本身的位置。

在较新版本的OpenSSH中,显示的是Base64编码的SHA-256,而不是十六进制的MD5。要显示旧式哈希,请使用

$ ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub


评论


您是否知道如何从该公钥转换为12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53这种格式?

– Kit Ho
2012年7月24日在16:37

@KitHo我不确定我是否理解您的问题。我更新了该示例,因为我认为ssh-keygen -lf将执行您想要的操作。

–本杰明·奥克斯(Benjamin Oakes)
2012年7月24日在18:53

通过SSH进入新计算机时,看到的不是用户的公用密钥指纹,而是主机的公用密钥指纹。因此,针对该问题的上下文的一个更好的示例是ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub。它显示的指纹也显示在SSH登录localhost上。

– Tanius
2014年8月25日在0:26



我的ssh-keygen报告了sha256指纹。为了获得md5指纹,我运行了ssh-keygen -l -E md5 -f〜/ .ssh / id_rsa.pub。 #archlinux

–贾斯汀C
15年10月28日在22:03

(@JustinC)默认情况下,OpenSSH 6.8版(2015年3月)及更高版本更改为SHA256,以base64而非十六进制显示。对于客户端,请使用ssh -o FingerprintHash = md5或ssh_config中的等效项,以及使用ssh之类的东西(如scp)。

–dave_thompson_085
16年6月12日19:36



#3 楼

指纹是Base64编码的公共密钥内二进制数据上的MD5。

$ ssh-keygen -f foo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in foo.
Your public key has been saved in foo.pub.
The key fingerprint is:
65:30:38:96:35:56:4f:64:64:e8:e3:a4:7d:59:3e:19 andrew@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|       +*..+*    |
|      =. +.=     |
|     . . .o .    |
|         o+   E  |
|        S= . + o |
|        . o o +  |
|           .   . |
|                 |
|                 |
+-----------------+
$ cat foo.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp andrew@localhost
$ echo 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp' \
    | base64 -D | md5
6530389635564f6464e8e3a47d593e19


md5sum 6530389635564f6464e8e3a47d593e19是生成密钥时显示的指纹。 ,但没有冒号。


但是,如果您正在处理Amazon在EC2密钥对控制台中显示的指纹,
不幸的是,这可能是另一种野兽。 。如果是32位十六进制字符串,则是上面的标准MD5 SSH公钥指纹。但是,如果它是40个十六进制数字,则实际上是通过采用PKCS#8格式的私钥的SHA1计算出的指纹:

$ openssl pkcs8 -in foo -nocrypt -topk8 -outform DER | openssl sha1 -c
e2:77:39:d3:53:a7:62:68:5f:da:82:0e:99:61:30:64:a2:88:c4:58


评论


我发现此答案在以下情况下很有用。您的系统使用SHA1来计算指纹,而您朋友的使用md5。我共享的指纹为SHA1,但与她的系统生成的MD5不匹配。这有所帮助-谢谢! sed's | ^ ssh-rsa ||' /etc/ssh/ssh_host_rsa_key.pub | sed's | ==。* $ | == |' | base64 -d | md5sum

– Liczyrzepa
2015年6月5日19:25



@Liczyrzepa,根据密钥类型和位大小,公共密钥字段的末尾可能有'==';也可能没有。使用awk'{print $ 2}'/path/to/keyfile.pub或类似名称更安全,并且IMO更容易使用。

–dave_thompson_085
16年6月12日在19:41

这是唯一说明如何计算指纹的答案

– Greuze
16-9-29在14:34

但是,在Linux Mint中,命令是:cat id_rsa.pub |切-d''-f2 | base64 -d | md5sum

– Greuze
16-9-29在14:40

长期以来,ssh使用base64编码的sha256哈希。要从外壳程序计算sha256指纹:awk'{print $ 2}'〜/ .ssh / id_ed25519.pub | base64 -d | sha256sum | xxd -r -p | base64 | tr -d =

– joshperry
19年4月4日在18:05

#4 楼

如果要检查SSH密钥文件以查看它是否与github报告为“部署密钥”相同,则适合您...

从私有URL:https ://github.com/ <用户名> / / settings / keys,您将看到


在终端:

$ ls -l id*
-rw-------  1 bruno  staff  1675 Mar 29 17:03 id_rsa
-rw-r--r--  1 bruno  staff   416 Mar 29 17:03 id_rsa.pub

$ ssh-keygen -E md5 -lf id_rsa
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e ec2-user@ip-10-2-1-16.ec2.internal (RSA)

$ ssh-keygen -E md5 -lf id_rsa.pub
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e ec2-user@ip-10-2-1-16.ec2.internal (RSA)


您会注意到,您的私钥和公钥都获得了相同的指纹。

该命令可以与GitHub的简洁功能结合使用,这是它们公开的事实在https://github.com/ <用户名> .keys

为用户的SSH公钥提供服务。这里是您可以利用的一线工具。

$ curl -sL https://github.com/RichardBronosky.keys | while read; do echo -e "\nkey #$((++i)):"; ssh-keygen -E md5 -lf - <<<"$REPLY"; echo $REPLY; done

key #1:
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJGT35gvsFveu+80qgurrLHId0h55E9jliM7Fo0mV9b7eg3EfyagkAcJUSMFkoov3HY4CW0yzOc7WlN57ABwvpRz1ioFDex0n0FkjoSEs5ROeT1OneRK6Bf6XnplgPuQ/LSSkv3kmK6I29R+YWi6TjDvLLoA5BrXJjOMfUv36jxWCDtk/5ZdhMZqhsMuDm06Jg5JBu6n5jQaZkmaIaunz7vOfwVG9LoCI+MYyIdo2S4VTva7Ee7jfAvgSUUgHTjhzsPO0/Ww5a/Kz2ehXW27aJxj/QPLfYR2LmTMbQKm3WpB8P1LjoiU7zjPoVoZ43a4P2JLUDidGKCd3eY5b5xewz

key #2:
2048 MD5:f7:98:f1:0b:73:c6:2a:21:00:7a:70:1d:0f:cf:d8:cc no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCQsZrjwKjB4WnE4SwVdDX5eEMxKzPHFBVKKpo9vvWUXRQwdTZy6iVOkyF26IPR+xDPzslzXOClKXUrWEh6La/EMpRwuMrWAbMIJFeDHOb56q4azgopoJmMJHo0yxGu0Ts4XszMACYRhlG6uK2AP5SYiOTp1zKPFjazXAdwLXyOvJurzy6KKuGJdSs/sj9+4uehgyRNOhehCSfg71tJJYwRvO2DDfLgaVEKOgZx58gEnJfhhz9D7rbvdZNhw/hCgtVNJaQF9Mdke2OPwWSo8i0/XNb9Bu/GRXqwMZrxDBhyzieocW40cwuzxWfzoi03aISdtQ1HtawH8+/sswviM1+B


#5 楼

ssh-keygen -r host.name.com


将为sshd实例输出所有已配置的公钥的指纹。

然后可以将其放入DNS SSHFP记录中。

#6 楼

要检查Azure Devops上存在的指纹,可以使用
 $ ssh-keygen -E md5 -lf .ssh/id_rsa.pub
2048 MD5:ba:42:24:87:d6:7b:71:a2:3e:b5:9a:31:b2:2c:e0:00 CrazyGirrafe@Australasia (RSA)