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

Kit*_* Ho 217 ssh

我总是发现当我ssh进入新机器时收到此消息:

12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*kes 212

您可以使用ssh-keygen如下方式为公钥生成指纹:

ssh-keygen -lf /path/to/key.pub
Run Code Online (Sandbox Code Playgroud)

具体示例(如果您使用 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)
Run Code Online (Sandbox Code Playgroud)

第一部分(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
Run Code Online (Sandbox Code Playgroud)

  • 我的 `ssh-keygen` 报告了 `sha256` 指纹。为了获得`md5`指纹,我运行了`ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub`。#archlinux (84认同)
  • 当通过 SSH 连接到一台新机器时,看到的不是用户的公钥指纹,而是主机的公钥指纹。所以问题上下文的一个更好的例子是`ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub`。它显示的指纹也显示在 SSH 登录到 localhost 时。 (8认同)
  • (@JustinC) OpenSSH 版本 6.8(2015 年 3 月)及更高版本更改为 SHA256,默认情况下以 base64 而不是十六进制显示。对于客户端,使用 `ssh -o FingerprintHash=md5` 或 `ssh_config` 中的等价物以及使用 `ssh` 的东西,如 `scp`。 (8认同)
  • 获取公钥的可视化表示(ASCII 艺术): `ssh-keygen -lvf ~/.ssh/id_rsa.pub` (3认同)

mad*_*aze 96

指纹基于主机的公钥,通常基于“/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/Public_key_fingerprint

  • “...小心并仔细检查您是否确实通过安全连接连接到了正确的主机”——愚蠢的问题,但如何轻松做到这一点? (11认同)
  • @Savara 当您连接到之前没有连接过的 SSH 服务器时,您应该向服务器管理员请求 SSH 服务器的公钥。服务器管理员会给你一段文字。您应该将此文本附加到文件`~/.ssh/known_hosts`。这样,当您连接到服务器时,您的 SSH 客户端将识别该服务器,因为您已将其公钥保存到“known_hosts”。因此,实际上,当 SSH 客户端告诉您“无法建立主机的真实性”时,您应该*永远*不要说“是”。您应该始终事先添加服务器的公钥。 (8认同)
  • 是的,我完全了解查看 SSH 指纹的机制是如何工作的,但是在很大一部分情况下,您无法选择通过其他渠道获取指纹。可悲的是,豆腐是我们经常得到的最好的。 (5认同)

and*_*w.n 81

指纹是 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
Run Code Online (Sandbox Code Playgroud)

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


但是,如果您正在处理 Amazon 在 EC2 Key Pairs 控制台中显示的指纹,不幸的是这可能是另一回事。如果是 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
Run Code Online (Sandbox Code Playgroud)

  • 这是解释如何计算指纹的唯一答案 (14认同)
  • 但是在 Linux Mint 中,命令是:```cat id_rsa.pub | 剪切 -d' ' -f2 | base64 -d | md5sum`` (2认同)
  • ssh 长期以来一直使用 Base64 编码的 sha256 哈希值。要从 shell 计算 sha256 指纹: `awk '{print $2}' ~/.ssh/id_ed25519.pub | Base64-d| sha256sum | sha256sum | xxd -r -p | xxd -r -p | 64 位 | tr -d =` (2认同)

Bru*_*sky 30

如果您想检查 SSH 密钥文件以查看它是否与 github 报告的“部署密钥”相同,这是给您的...

从私有 URL: https://github.com/<username>/<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)
Run Code Online (Sandbox Code Playgroud)

您会注意到私钥和公钥的指纹相同。

相同的命令可以与 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
Run Code Online (Sandbox Code Playgroud)