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

Rya*_*yan 111 security linux ssh rsa command

我有两个文件,id_rsaid_rsa.pub. 什么命令可用于验证它们是否是有效对?

Mic*_*nik 150

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

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

(这到底是怎么做到的?我只能希望公钥直接或间接编码在私钥中......)

我自己需要这个并使用以下 Bash one-liner。如果键属于一起,它应该不输出任何内容。-q对脚本中的差异应用一点点,差异只会适当地设置返回码。

PRIVKEY=id_rsa
TESTKEY=id_rsa.pub
diff <( ssh-keygen -y -e -f "$PRIVKEY" ) <( ssh-keygen -y -e -f "$TESTKEY" )
Run Code Online (Sandbox Code Playgroud)

  • 只要 id_rsa.pub 存在,`ssh-keygen -y -e -f id_rsa` 就根本不会检查 id_rsa 而只是从 id_rsa.pub 返回值。因此,例如,如果您使用 `echo 5 &gt; id_rsa` 来擦除私钥,然后执行差异,差异就会通过!此外,在 foo 不是有效密钥(并且没有相应的 foo.pub)的情况下运行 `ssh-keygen -yef foo` 将阻止等待用户输入,因此在脚本中使用它时要小心。 (15认同)
  • “这到底是怎么回事”.. 私钥是随机生成的,所以我们都有一个唯一的密钥。如果您在此私钥上应用可重复的单向 RSA 算法,您将获得唯一的公钥。没有任何算法可以对公钥执行以获得唯一的私钥。 (3认同)
  • @Michuelnik 您可以从私钥派生公钥。您无法从公钥中导出私钥。不是在谈论它加密的材料。 (3认同)

小智 56

根据您获取正在测试的公钥文件的位置,接受的答案可能会给出误报结果。这是因为@drewbenn 在评论中描述的行为。具体来说,当 -e 选项与私钥文件一起用作 -f 选项参数时,它只是模仿(但重新格式化)相关公钥文件中的内容。

换句话说,

ssh-keygen -y -f id_rsa
Run Code Online (Sandbox Code Playgroud)

(显然)生成公钥值,和

ssh-keygen -y -e -f id_rsa
Run Code Online (Sandbox Code Playgroud)

简单地输出(和重新格式化)现有id_rsa.pub 中的密钥,无论它是什么

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

ssh-keygen -y -f id_rsa | cut -d' ' -f 2
Run Code Online (Sandbox Code Playgroud)

cut -d' ' -f 2 id_rsa.pub
Run Code Online (Sandbox Code Playgroud)

所以:

diff <(cut -d' ' -f 2 id_rsa.pub) <(ssh-keygen -y -f id_rsa | cut -d' ' -f 2)
Run Code Online (Sandbox Code Playgroud)

也许这不是那么灵活,但它更适合我的需求。也许它可以帮助别人。

  • 这真的应该取代公认的答案,或者至少在投票方面超过它。 (7认同)
  • 谢谢你!此命令不适用于带有密码短语的密钥,它不会以交互方式询问该密码。我将两个 () 命令内容提取到文件中并对它们进行比较,这有效。 (4认同)

小智 14

最简单的是比较指纹,因为公钥和私钥具有相同的。通过将两个命令放在同一行,视觉比较非常容易:

ssh-keygen -l -f PRIVATE_KEY; ssh-keygen -l -f PUBLIC_KEY
Run Code Online (Sandbox Code Playgroud)

以编程方式,您需要忽略注释部分,因此

diff -s <(ssh-keygen -l -f PRIVATE_KEY | cut -d' ' -f2) <(ssh-keygen -l -f PUBLIC_KEY | cut -d' ' -f2)
Run Code Online (Sandbox Code Playgroud)


Mic*_*ton 6

如果他们是你的本地系统上,贴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
Run Code Online (Sandbox Code Playgroud)