PEM ssh 密钥的指纹

PEM ssh 密钥的指纹

我有一个 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.

答案1

如果你想找回丢失的公钥文件的指纹,你可以从私钥文件中恢复

$ 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 指纹。您可以使用选项打印密钥的 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)

答案2

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

(以上输出中的指纹已被删除)

答案3

这是一个可以完成您想要的操作而无需在本地创建公钥文件的单行程序。

$ 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 字符串<<<,以便将 stdin 作为常规文件(/dev/stdin)而不是管道使用,因为ssh-keygen只能对文件进行操作。

作为openssh 7.2 版 ssh-keygen支持标准输入的指纹识别:

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

请注意,此命令将无法使用使用密码短语且未使用代理的私钥。它应该适用于不使用密码短语的 AWS 或 OpenStack 生成的 pem 文件。

https://stackoverflow.com/questions/2635360/ssh-keygen-accepting-stdin了解更多信息。

答案4

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

事实上,ssh-keygen 已经告诉过你这一点:

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

对密钥的公共部分运行它,它应该可以工作。

更一般地来说

想想看:指纹存在的原因是您可以识别公钥。事实上,获取私钥的哈希值除了对服务器无用之外还存在潜在的安全问题(服务器甚至没有相关的私钥)。

获得公钥后,接下来的过程就是验证客户端是否拥有相应的私钥。由于您已经知道要验证哪些密钥,因此不需要指纹。

相关内容