您如何测试公共/私有DSA密钥对?


167

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

同样,这些是发布/密钥文件DSA。

我真的更喜欢单线的……

Answers:


259

我发现了一种对我来说似乎更好的方法:

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

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


2
这到底是做什么的?为什么用ssh?
sammiwei 2012年

2
可能是因为他使用密钥对进行ssh身份验证
etarion 2012年

2
以我为例,一台中央工作服务器有几十个id_rsa.pub.blahhost文件,我不知道哪个文件与单独的id_rsa私钥匹配,我正在设置无密码的scp,以便可以从旧网站上迁移。制作新的密钥对不是一种选择。我的键设置得很好,不会弄乱它。
克里斯·K

1
该解决方案似乎适用于所有类型的SSH密钥。我什至设法用这种方法恢复了放错地方的公钥。
加里·图尔基亚

53

我总是使用以下命令比较模数的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

如果哈希值匹配,则这两个文件将一起存储。


48

对于DSA密钥,请使用

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

打印公钥,然后

 openssl dsa -in dsa.key -modulus -noout

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


18

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

    openssl x509 -in certfile -modulus -noout

对于每个私钥,请执行

    openssl rsa -in keyfile -modulus -noout

然后按模数匹配键。


17

使用diff可以使检查更加容易:

diff <(ssh-keygen -y -f <private_key_file>) <public key file>

唯一奇怪的是,如果文件相同,差异什么也不会说,所以只有在公共和私有匹配的情况下才会告诉您。


3
在文件匹配时获取输出:diff -s
Roland

3
这是一个很好的答案。(1)diff -qs返回一个简单的“相同/不相同的答案。(2)您应在运行差异之前删除公钥文件中的注释
。– emory

7

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


3
问题是询问如何进行验证,而我们将要对其进行验证的设备可能没有生成新设备的功能。
ArmenB '16

5

输入以下命令,检查$ 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)


我想您应该详细说明一下,您的帖子确实接近stackoverflow.com/a/22595408/3102264
mpromonet


4

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

在此处输入图片说明

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


1

用公钥加密某些内容,然后查看哪个私钥对其进行解密。

杰夫·阿特伍德(Jeff Atwood)撰写的这篇代码项目文章围绕.NET加密类实现了简化的包装器。假设这些密钥是为与RSA一起使用而创建的,则将非对称类与您的公共密钥一起使用进行加密,并与您的私有密钥进行解密一起使用。


我正在寻找更简单的东西。说,壳一个衬板或类似的东西。我在linux上,并已安装了诸如openssl之类的常规内容。
Loki

3
这几乎就像说将公用密钥添加到您的authorized_keys文件中并使用ssh查看哪个私钥一样有用。该方法有效,但是很痛苦。
布拉德利·克里德

0

如果没有返回任何内容,则它们匹配:

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh -i $HOME/.ssh/id_rsa localhost

-2

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


1
这不允许测试私钥-公钥对
MatFiz '16
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.