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

Encryption 如何测试公共/私有DSA密钥对?,encryption,ssl,openssl,key,Encryption,Ssl,Openssl,Key,有没有一种简单的方法来验证给定的私钥是否与给定的公钥匹配?我有一些*.pub和一些*.key文件,我需要检查哪些文件与哪些文件匹配 同样,这些是发布/密钥文件DSA 我真的更喜欢某种类型的单行程序…用公钥加密某些东西,然后看看哪个私钥解密它 这只不过是围绕.NET加密类实现了一个简化的包装器。假设这些密钥是为与RSA一起使用而创建的,则将非对称类与公钥一起使用进行加密,与私钥一起使用进行解密。假设您在X.509证书中有公钥,并且假设它们是RSA密钥,则对于每个公钥,请执行以下操作 ope

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

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


我真的更喜欢某种类型的单行程序…

用公钥加密某些东西,然后看看哪个私钥解密它


这只不过是围绕.NET加密类实现了一个简化的包装器。假设这些密钥是为与RSA一起使用而创建的,则将非对称类与公钥一起使用进行加密,与私钥一起使用进行解密。

假设您在X.509证书中有公钥,并且假设它们是RSA密钥,则对于每个公钥,请执行以下操作

    openssl x509 -in certfile -modulus -noout
对于每个私钥,执行以下操作

    openssl rsa -in keyfile -modulus -noout
然后按模数匹配键。

对于DSA键,使用

 openssl dsa -pubin -in dsa.pub -modulus -noout
打印公钥,然后

 openssl dsa -in dsa.key -modulus -noout

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

我找到了一种似乎更适合我的方法:

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

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

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

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

如果散列匹配,则这两个文件一起使用。

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

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

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

diff如果您在Windows中希望使用GUI,则可以将私钥导入其中:


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

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

ssh-keygen -y -f ~/.ssh/id_rsa | diff -s - <(cut -d ' ' -f 1,2 ~/.ssh/id_rsa.pub)
我编写了一个shell脚本,用户使用它来检查他们的~/.ssh/文件的文件权限和匹配的密钥集。它解决了我在设置ssh时遇到的用户问题。这可能对你有帮助


注意:我之前的回答(2018年3月)不再适用于openssh的最新版本。上一个答案:diff-qs如果它不返回任何内容,则它们匹配:

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

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

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)

diff-s我在找更简单的东西。比如说,一个贝壳一个衬里之类的。我在linux上,安装了openssl之类的普通工具。这几乎和在授权密钥文件中添加公钥并使用ssh查看哪个私钥有效一样有用。这种方法是有效的,但它是一种痛苦。这到底有什么作用?为什么使用ssh?可能是因为他使用密钥对进行ssh身份验证在我的案例中,一个中央工作服务器有几十个
id\u rsa.pub.blahhost
文件,我不知道哪一个文件与唯一的
id\u rsa
私钥匹配&我正在设置无密码scp,以便可以从旧网站迁移。制作一个新的密钥对不是一个选项;我已经很好地设置了我的密钥,不会把它搞砸。这个解决方案似乎适用于所有类型的SSH密钥。我甚至用这种方法恢复了一个放错地方的公钥。这太棒了。感谢您在文件匹配时获得输出:
diff-s
这是一个很好的答案。(1)
diff-qs
返回一个简单的“相同/不相同答案”(2)在运行diff之前,您应该删除公钥文件中的注释。另一件奇怪的事情是我的
中的注释-我不得不求助于更有经验的人来了解公钥文件的结构。答案最近更新。
表示您将密钥文件引用放在这里,例如私人密钥的名称不带括号的y文件路径,如果路径中有(例如)空格,则执行所需的转义操作。它是一个占位符。
$private_key_file
指的是一个变量,该变量可以定义,也可以不定义,并解析为私钥文件路径。如果未定义,或者该文件不可用(例如,您没有权限),这将创建一个错误。问题是如何验证,并且我们将在其上验证的设备可能没有生成新设备的功能。这不允许测试私钥-公钥对为什么不允许?您从私钥导出公钥,并与您拥有的公钥文件进行比较。我希望使用命令行,但方法也可以工作。我想您应该详细说明一下,您的帖子非常接近交叉发布到服务器的错误:假设您在X.509证书中有公钥——如果我有一个没有证书的普通公钥呢?
diff -s <(ssh-keygen -l -f PRIVATE_KEY | cut -d' ' -f2) <(ssh-keygen -l -f PUBLIC_KEY | cut -d' ' -f2)