是否有一种简单的方法来验证给定的私钥是否与给定的公钥相匹配?我有一些 *.pub和一些 *.key文件,我需要检查哪一个与哪一个。
*.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>
该命令将输出给定私钥的公钥,因此只需将输出与每个 * 进行比较。酒吧档案。
删除公钥并从私钥中生成新的公钥。将它们保存在单独的目录中,或者使用一个变数命名原则将它们直接保存在目录中。
我总是使用以下命令比较模数的 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你可以导入你的私钥:
一旦导入,您可以保存它的公钥并将其与您的进行比较。
在 $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显示键是否合适的消息。