Comment vérifier si une paire de clés publique / privée RSA correspond

72

J'ai deux fichiers id_rsaet id_rsa.pub. Quelle commande peut être utilisée pour valider s’il s’agit d’une paire valide ?

Ryan
la source
Je vais confirmer la réponse de Michuelnik. cela m'a évité de créer une nouvelle paire de clés, merci. ssh -vaide beaucoup aussi.
Chris K

Réponses:

93

Je préférerais le ssh-keygen -y -e -f <private key>chemin à la place de la réponse acceptée de Comment tester une paire de clés DSA publique / privée? débordement de pile.

ssh-keygen -y -e -f <private key>prend une clé privée et imprime la clé publique correspondante qui peut être comparée directement à vos clés publiques disponibles. (Astuce: méfiez-vous des commentaires ou des options-clés.)

(Comment diable fait-il cela? Je ne peux qu'espérer que la clé publique soit codée directement ou indirectement dans la clé privée ...)

J'en avais besoin moi-même et utilisais le one-liner Bash suivant. Il ne doit rien sortir si les clés vont ensemble. Appliquez un peu -qà la diff dans les scripts et diff seulement définit le code de retour de manière appropriée.

PRIVKEY=id_rsa
TESTKEY=id_rsa.pub
diff <( ssh-keygen -y -e -f "$PRIVKEY" ) <( ssh-keygen -y -e -f "$TESTKEY" )
Michuelnik
la source
1
@ MichaelHampton: maintenant je comprends votre commentaire. "La réponse acceptée" devrait faire référence à la question sur stackoverflow pas cette question ...
Michuelnik
1
@Sirch: Je pensais que la décision qui est la clé privée et celle qui est publique est purement aléatoire puisque les deux clés sont égales. Ce que l'une des clés crypte ne peut être déchiffré qu'avec l'autre. Et si une clé pouvait être obtenue de l'autre, tout ne fonctionnerait pas.
Michuelnik
1
@Michuelnik Vous pouvez dériver la clé publique de la clé privée. Vous ne pouvez pas dériver la clé privée de la clé publique. Ne parlaient pas du matériel qu'il chiffre.
Sirch
1
@ Michèlenik à mon humble avis, la question est hors sujet sur SO et sur sujet ici (et / ou superutilisateur). À mon humble avis, il ne devrait pas être marqué en tant que doublon, mais signalé ici pour migration. Mais c'est couvert sur les deux donc j'aime le partage plus complet de l'information.
Chris K
10
Tant que id_rsa.pub existe, ssh-keygen -y -e -f id_rsane vérifie absolument pas id_rsa mais renvoie simplement la valeur de id_rsa.pub. Donc, par exemple, si vous echo 5 > id_rsaeffacez la clé privée, faites le diff, le diff passera! En outre, ssh-keygen -yef foosi foo n'est pas une clé valide (et n'a pas de fichier foo.pub correspondant), l'attente de la saisie par l'utilisateur sera bloquée. Soyez donc prudent si vous utilisez ceci dans un script.
32

Selon la source où vous obtenez le fichier de clé publique que vous testez, la réponse acceptée peut donner des résultats faux positifs. Cela est dû au comportement décrit dans le commentaire de @drewbenn. Plus précisément, lorsque l'option -e est utilisée avec le fichier de clé privée en tant que paramètre d'option -f, elle ne fait que perroquets (mais reformate) le contenu du fichier de clé publique associé.

En d'autres termes,

ssh-keygen -y -f id_rsa

(apparemment) génère la valeur de la clé publique, et

ssh-keygen -y -e -f id_rsa

simplement et affiche (et reformate) la clé dans le fichier id_rsa.pub existant, quel qu’il soit .

Dans mon cas, je dois vérifier que la paire n'a pas été corrompue. J'ai donc décidé de comparer ce qui suit:

ssh-keygen -y -f id_rsa | cut -d' ' -f 2

avec

cut -d' ' -f 2 id_rsa.pub

Donc:

diff <(cut -d' ' -f 2 id_rsa.pub) <(ssh-keygen -y -f id_rsa | cut -d' ' -f 2)

Ce n’est peut-être pas aussi flexible, mais c’est mieux pour mes besoins. Peut-être que cela aide quelqu'un d'autre.

twildfarmer
la source
5
Cela devrait remplacer la réponse acceptée ou au moins la surpasser.
thomanski
Je vous remercie! Cette commande ne fonctionne pas avec les clés avec une phrase secrète, elle ne demande pas cela de manière interactive. J'ai extrait le contenu de la commande two () dans des fichiers et les ai différenciés, cela fonctionne.
Yaroslav Nikitenko
5

S'ils sont sur votre système local, le bâton id_rsa.pubdans votre $HOME/.ssh/authorized_keyset sshà l' localhostaide de la id_rsaclé. Si cela fonctionne, alors ils correspondent.

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh -i $HOME/.ssh/id_rsa localhost
Michael Hampton
la source