什么是 SSH 密钥指纹以及如何生成它?

什么是 SSH 密钥指纹以及如何生成它?

我总是发现当我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-How-to-get-ssh-server-fingerprint-information.html
和:http://en.wikipedia.org/wiki/Public_key_fingerprint

答案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

答案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 是生成密钥时显示的指纹,只是没有分隔的冒号。


但是,如果你正在处理亚马逊在 EC2 密钥对控制台中显示的指纹, 不幸的是,这可能是另一种情况。如果是 32 位十六进制字符串,则为上述标准 MD5 SSH 公钥指纹。但如果是 40 位十六进制数字,则实际上是通过对私钥PKCS#8 格式:

$ 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

答案4

要检查 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)

相关内容