什么是SSH密钥指纹,它是如何生成的?


128

当我ssh进入新机器时,总是会收到以下消息:

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

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

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

Answers:


65

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

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

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

请参阅:http
: //www.lysium.de/blog/index.php?/archives/186-How-to-get-ssh-server-fingerprint-information.html和:http : //en.wikipedia.org/ Wiki /公共钥匙指纹


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

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

@Savara如果执行此操作,则当SSH客户端告诉您“无法建立客户端的真实性”或告诉您“服务器的公共密钥已更改”时,您会发现有些麻烦。因此,您应该始终~/.ssh/known_hosts事先将服务器的公共密钥添加到文件中,并且当您的SSH客户端告诉您“无法建立客户端的真实性”或告诉您“服务器的公共密钥已经被使用时,请不要说是”。已更改”。
Utku

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

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

104

您可以使用以下方式为公钥生成指纹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)是公用密钥的指纹,第三部分是公用密钥文件本身的位置。


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

@KitHo我不确定我是否理解您的问题。我更新了该示例,因为我认为ssh-keygen -lf它将满足您的要求。
本杰明·奥克斯

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

57
ssh-keygen报告的sha256指纹。为了得到md5指纹,我跑了ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub。#archlinux
贾斯汀C

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

72

指纹是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

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

这对于理解为什么此指纹与DNS SSHFP记录中的指纹不匹配非常重要,因为它们使用SHA-1或SHA-256摘要。
neirbowj 2015年

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

13
这是解释指纹计算方式的唯一答案
'14

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

13

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

从私有URL:https://github.com/ <用户名> / <repo_name> / settings / keys,您将看到 来自github的屏幕截图

在航站楼:

$ 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/<username>.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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.