如何检查RSA公钥/私钥对是否匹配


71

我有两个文件,id_rsaid_rsa.pub。可以使用什么命令来验证它们是否有效


我会确认米歇尔尼克的回答;谢谢,它使我不必再进行新的密钥对。ssh -v也有很大帮助。
克里斯·K

Answers:


91

我更喜欢这种ssh-keygen -y -e -f <private key>方式,而不是“ 如何测试公共/私有DSA密钥对? ”的公认答案在堆栈溢出。

ssh-keygen -y -e -f <private key>获取一个私钥并打印相应的公钥,该公钥可以直接与您可用的公钥进行比较。(提示:提防注释或键选项。)

(这到底是怎么回事?我只能希望将公钥直接或间接编码为私钥...)

我自己需要这个,并使用了以下Bash单线。如果键属于一起,则不应输出任何内容。-q对脚本中的差异稍加应用,差异仅适当​​地设置返回码。

PRIVKEY=id_rsa
TESTKEY=id_rsa.pub
diff <( ssh-keygen -y -e -f "$PRIVKEY" ) <( ssh-keygen -y -e -f "$TESTKEY" )

1
@MichaelHampton:现在我明白您的评论了。“公认的答案”应该指的是关于stackoverflow的问题,而不是这个问题……
Michuelnik 2012年

1
@Sirch:我认为哪个密钥是私有密钥,哪个密钥是公共密钥是完全随机的,因为两个密钥是相等的。一个密钥加密的内容只能与另一个密钥解密。如果可以从另一个获得一个密钥,那么所有这些都不可行。
Michuelnik

1
@Michuelnik您可以从私钥派生公钥。您不能从公钥派生私钥。并不是在谈论它加密的材料。
希尔奇(Sirch)2013年

1
@Michuelnik imho,问题不在SO上,而是在这里(和/或Superuser)。恕我直言,不应将其标记为重复,而应将其标记为要迁移。但这两者都涵盖了,因此我喜欢更完整的信息共享。
克里斯K

10
只要id_rsa.pub存在,ssh-keygen -y -e -f id_rsa就不会检查id_rsa,而只是从id_rsa.pub返回值。因此,例如,如果您echo 5 > id_rsa删除私钥,然后进行比较,则比较将通过!另外,ssh-keygen -yef foo在foo不是有效键(并且没有对应的foo.pub)的地方运行将阻止等待用户输入,因此请在脚本中谨慎使用此命令。

31

根据获得测试的公共密钥文件的位置,接受的答案可能会给出错误的肯定结果。这是由于@drewbenn的注释中描述的行为。具体来说,当-e选项与私钥文件一起用作-f选项参数时,它只是模仿(但重新格式化)了相关联的公钥文件中的内容。

换一种说法,

ssh-keygen -y -f id_rsa

(显然)生成公钥值,并且

ssh-keygen -y -e -f id_rsa

简单地和输出(并格式化)在关键现有 id_rsa.pub 不管它是

就我而言,我必须验证该对没有损坏。因此,我决定比较以下内容:

ssh-keygen -y -f id_rsa | cut -d' ' -f 2

cut -d' ' -f 2 id_rsa.pub

因此:

diff <(cut -d' ' -f 2 id_rsa.pub) <(ssh-keygen -y -f id_rsa | cut -d' ' -f 2)

也许这不那么灵活,但是对我来说更好。也许它可以帮助别人。


5
实际上,这应该代替接受的答案,或者至少在投票方面超过它。
thomanski

谢谢!此命令不适用于带有密码短语的键,它不会交互地询问。我将两个()命令内容提取到文件中,并对其进行了差异化处理,这是可行的。
Yaroslav Nikitenko

5

如果他们是你的本地系统上,贴id_rsa.pub在你$HOME/.ssh/authorized_keyssshlocalhost使用id_rsa密钥。如果有效,则它们匹配。

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh -i $HOME/.ssh/id_rsa localhost
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.