PEM SSH密钥的指纹


30

我有一个PEM文件,我将其添加到正在运行的ssh-agent中:

$ file query.pem
query.pem: PEM RSA private key

$ ssh-add ./query.pem
Identity added: ./query.pem (./query.pem)

$ ssh-add -l | grep query
2048 ef:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX ./query.pem (RSA)

如何直接从文件中获取密钥的指纹(在ssh-agent中看到)?我知道ssh-keygen -l -f some_key适用于“普通” ssh密钥,但不适用于PEM文件。

如果我在.pem文件上尝试ssh-keygen,则会得到:

$ ssh-keygen -l -f ./query.pem                                             
key_read: uudecode PRIVATE KEY----- failed
key_read: uudecode PRIVATE KEY----- failed
./query.pem is not a public key file.

此项以以下内容开头:

-----BEGIN RSA PRIVATE KEY-----
MIIEp.... etc.

与“常规”私钥相反,后者类似于:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E15F2.... etc.

您为什么会认为它不适用于PEM文件?尝试时会遇到什么错误?阿.ssh/id_rsa通过使用OpenSSH所有默认值生成的文件是一个PEM文件。私钥默认情况下是PEM编码的。实际上,您可以将通过OpenSSL生成的RSA密钥直接与OpenSSH一起使用。
Zoredache

使用.pem上ssh-keygen的输出更新了描述
未知

(后来却坏了)@Zoredache:在7.2之前(2016年,在此Q之后)ssh-keygen -l无法读取私钥文件,尽管其他ssh-keygen(和ssh*)操作也可以。但是,当ssh-keygen 生成密钥时,它会同时写入privatekey文件id_rsa 相应的publickey文件(.pub例如添加)id_rsa.pub。较早的版本ssh-keygen -l 尝试将其添加.pub到您指定的文件名中并读取该公钥文件。
dave_thompson_085

Answers:


34

如果要检索丢失的公用密钥文件的指纹,可以从专用密钥文件中恢复它

$ ssh-keygen -yf path/to/private_key_file > path/to/store/public_key_file

然后,您可以确定公共指纹:

$ ssh-keygen -lf path/to/store/public_key_file
2048 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@host (RSA)

在某些较新的系统上,这会打印密钥的SHA256指纹。您可以使用option打印密钥的MD5指纹(冒号形式)-E

$ ssh-keygen -E md5 -lf path/to/store/public_key_file
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)

作为一个命令行

$ ssh-keygen -yf /etc/ssh/ssh_host_ecdsa_key | ssh-keygen -E md5 -lf -
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)

@MikeD的答案实际上是OP正在寻找的内容(以及我正在寻找的内容)的“正确”答案。AWS提供了他显示的格式的指纹,并用冒号分隔了成对的数字。他的解决方案(来自提供的AWS页面)也以相同的方式生成指纹,以便您可以正确验证。
迈克·威廉姆森

50

AWS的“ 验证密钥对的指纹 ”根据问题的创建方式提供了两种解决方案,可以解决这一问题。

如果您使用AWS创建密钥对:

$ openssl pkcs8 -in query.pem -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

或者,如果您使用第三方工具创建了密钥对:

$ openssl rsa -in query.pem -pubout -outform DER | openssl md5 -c
writing RSA key
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

(上面输出中编辑的指纹)


6

这是一种无需您在本地创建公用密钥文件即可执行所需操作的衬板。

$ ssh-keygen -lf /dev/stdin <<< $( ssh-keygen -f ~/.ssh/keyname.pem -y )
2048 14:df:c7:b7:f1:26:7f:87:d5:e7:10:6c:ac:af:a2:03 /dev/stdin (RSA)

它使用bash here字符串<<<来使stdin可以作为常规文件(/dev/stdin)使用,而不是ssh-keygen仅用于文件操作的管道。

opensh 7.2版本开始, ssh-keygen支持来自标准输入的指纹识别:

  • ssh-keygen(1):允许来自标准输入的指纹识别,例如“ ssh-keygen -lf-”

请注意,此命令将与使用密码短语且未使用代理的私钥中断。它应与不使用密码短语的AWS或OpenStack生成的pem文件一起使用。

有关更多信息,请参见https://stackoverflow.com/questions/2635360/ssh-keygen-accepting-stdin


发行说明没有说,但是根据7.2的来源,它-l也支持读取私钥文件(但不能从stdin中读取)。
dave_thompson_085

2

您不是从私钥文件中获取指纹,而是从公钥文件中获取指纹。

实际上,ssh-keygen已经告诉您了这一点:

./query.pem不是公共密钥文件。

针对密钥的公共部分运行它,它应该起作用。

一般而言

考虑一下:存在指纹的原因是您可以识别公钥。实际上,除了对服务器无用之外,获取私钥的哈希是一个潜在的安全问题(甚至没有问题的私钥)。

拥有公钥后,该过程将验证客户端是否拥有相应的私钥。由于您已经知道要尝试验证的密钥,因此不需要指纹。


问题是我没有这个私钥的公钥:(另一件事,ssh-keygen是在RSA私钥文件上工作的,该文件在开始时有额外的信息(请参阅我的初始文章),但是在这个文件上却没有。 。
未知

然后,您无能为力。您不能从私钥中获取公钥的一半,而只能相反。
Stephane

3
不对 正如@ominug上面指出的那样ssh-keygen -yf
史蒂夫·贝内特

4
@Stephane虽然在纯RSA级别上是正确的,但实际上,密钥在PKCS规范中的存储方式实际上是私钥的格式同时包括两个密钥。比较规范的民营 VS 公共
哈坎·林奎斯特

“您不能从私密部分获得公钥的一半...”-哦,是的,您可能可以。从私钥中获取模数,并使用65537作为公钥,很可能您已经找到了公钥。
Jim Flood
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.