177

有没有一种简单的方法来验证给定的私钥是否与给定的公钥匹配?我有*.pub几个*.key文件,我需要检查哪个文件。

同样,这些是 pub/key 文件,DSA。

我真的更喜欢某种单线...

4

12 回答 12

274

我找到了一种似乎对我更有效的方法:

ssh-keygen -y -f <private key file>

该命令将输出给定私钥的公钥,因此只需将输出与每个 *.pub 文件进行比较。

于 2008-11-08T12:22:00.473 回答
59

我总是使用以下命令比较模数的 MD5 哈希:

Certificate: openssl x509 -noout -modulus -in server.crt | openssl md5
Private Key: openssl rsa -noout -modulus -in server.key | openssl md5
CSR: openssl req -noout -modulus -in server.csr | openssl md5

如果哈希匹配,那么这两个文件一起去。

于 2008-11-11T13:48:05.057 回答
49

对于 DSA 密钥,使用

 openssl dsa -pubin -in dsa.pub -modulus -noout

打印公钥,然后

 openssl dsa -in dsa.key -modulus -noout

显示与私钥对应的公钥,然后进行比较。

于 2008-11-08T11:06:04.480 回答
20

假设您在 X.509 证书中有公钥,并假设它们是 RSA 密钥,那么对于每个公钥,执行

    openssl x509 -in certfile -modulus -noout

对于每个私钥,执行

    openssl rsa -in keyfile -modulus -noout

然后按模数匹配键。

于 2008-11-08T09:49:43.527 回答
20

使用 diff 可以更轻松地进行检查:

diff <(ssh-keygen -y -f $private_key_file) $public_key_file

唯一奇怪的是,如果文件相同,diff 什么也不说,所以只有公共和私人匹配时才会告诉你。

于 2014-03-23T18:50:38.797 回答
7

输入以下命令,检查私钥和公钥是否是$USER/.ssh 目录中的匹配集(相同)或不匹配集(不同)。cut 命令防止比较公钥中行尾的注释,只允许比较密钥。

ssh-keygen -y -f ~/.ssh/id_rsa | diff -s - <(cut -d ' ' -f 1,2 ~/.ssh/id_rsa.pub)

输出看起来像这些行中的任何一个。

Files - and /dev/fd/63 are identical

Files - and /dev/fd/63 differ

我编写了一个 shell 脚本,用户使用它来检查他们的 ~/.ssh/files 和匹配的密钥集的文件权限。它解决了我在用户事件设置 ssh 时遇到的挑战。它可能会帮助你。 https://github.com/BradleyA/docker-security-infrastructure/tree/master/ssh

注意:我之前的回答(2018 年 3 月)不再适用于最新版本的 openssh。上一个答案: diff -qs <(ssh-keygen -yf ~/.ssh/id_rsa) <(cut -d ' ' -f 1,2 ~/.ssh/id_rsa.pub)

于 2018-03-04T18:46:32.903 回答
5

删除公钥并从私钥生成新的。将它们保存在单独的目录中,或使用命名约定使它们保持直截了当。

于 2008-11-08T12:35:59.120 回答
4

如果您在 Windows 中并且想要使用 GUI,您可以使用puttygen将您的私钥导入其中:

在此处输入图像描述

导入后,您可以保存其公钥并将其与您的进行比较。

于 2016-09-27T10:49:06.557 回答
1

用公钥加密一些东西,看看哪个私钥解密它。

这篇由Jeff Atwood撰写的Code Project 文章围绕 .NET 加密类实现了一个简化的包装器。假设这些密钥是为与 RSA 一起使用而创建的,请使用非对称类和您的公钥进行加密,并使用您的私钥进行解密。

于 2008-11-08T09:38:12.350 回答
1

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

ssh-keygen -l -f PRIVATE_KEY; ssh-keygen -l -f PUBLIC_KEY

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

diff -s <(ssh-keygen -l -f PRIVATE_KEY | cut -d' ' -f2) <(ssh-keygen -l -f PUBLIC_KEY | cut -d' ' -f2)
于 2021-05-06T17:59:51.347 回答
0

如果它什么都不返回,那么它们匹配:

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh -i $HOME/.ssh/id_rsa localhost
于 2019-04-08T10:52:39.327 回答
-1

只需使用puttygen并将您的私钥加载到其中即可。它提供了不同的选项,例如导出相应的公钥。

于 2013-11-13T09:41:06.703 回答