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

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

同样,这些是酒吧/钥匙文件,DSA。

我更喜欢一句俏皮话。

182505 次浏览

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

这个 代码项目文章不是别人,正是 杰夫 · 阿特伍德实现了一个简化的包装器。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>

该命令将输出给定私钥的公钥,因此只需将输出与每个 * 进行比较。酒吧档案。

删除公钥并从私钥中生成新的公钥。将它们保存在单独的目录中,或者使用一个变数命名原则将它们直接保存在目录中。

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

如果散列符合,那么这两个文件就会一起出现。

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

使用 diff 可以使检查变得更容易:

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

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

如果你在 Windows 系统中并且想要使用 GUI,使用 Puttygen你可以导入你的私钥:

enter image description here

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

在 $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.酒吧)

如果没有返回任何值,那么它们就匹配:

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)

这个答案应该包含一个警告: Https://stackoverflow.com/a/67423640/1312559

警告!如果公钥和私钥在同一个目录中,即使给出了私钥作为参数,也会计算公钥的指纹。

-l' Show fingerprint of specified public key file. Private RSA1 keys are also supported. For RSA and DSA keys ssh-keygen tries to find the matching public key file and prints its fingerprint.

不幸的是,我没有评论的声誉。

一个简单的脚本,检查键与3个选项的匹配:

 #!/bin/bash


PRKEY=mysshkey
PUKEY=mysshkey.pub


echo "1. OUTPUT"
diff <( ssh-keygen -y -e -f "${PRKEY}" ) <( ssh-keygen -y -e -f "${PUKEY}")
echo -e "\n"


echo "2. OUTPUT"
diff <( cut -d' ' -f 2 ${PUKEY} ) <( ssh-keygen -y -f "${PRKEY}" | cut -d' ' -f 2)
echo -e "\n"


echo "3. OUTPUT"
DIFF=$(diff <( cut -d' ' -f 2 ${PUKEY} ) <( ssh-keygen -y -f "${PRKEY}" | cut -d' ' -f 2) )
if [ "$DIFF" != "" ]; then
echo "ERROR KEY"
else
echo "TRUE KEY"
fi

如果它们的键不匹配,您将得到输出1和2的输出。

如果他们的键匹配,你得不到输出。

输出3显示键是否合适的消息。