web-dev-qa-db-fra.com

Comment vérifier si une clé privée SSH a une phrase de passe ou non?

Disons que j'ai accès à la partie privée d'une paire de clés RSA. Comment puis-je vérifier si cette clé a une phrase secrète associée ou non?

68
kung

Le fichier de clés aura un en-tête différent s'il est protégé par mot de passe. Voici le haut d'une clé sans phrase secrète:

-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA3qKD/4PAc6PMb1yCckTduFl5fA1OpURLR5Z+T4xY1JQt3eTM

Et voici le haut d'une clé protégée par une phrase secrète:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,556C1115CDA822F5

AHi/3++6PEIBv4kfpM57McyoSAAaT2ECxNOA5DRKxJQ9pr2D3aUeMBaBfWGrxd/Q

Malheureusement, cela ne fonctionne qu'en regardant les fichiers. Je ne connais aucun moyen pour un serveur d'être en mesure de dire si les clés qui lui sont présentées étaient protégées par une phrase secrète, qui est l'endroit le plus utile pour pouvoir tirer parti de ce type d'informations.

98
gowenfawr

Ce n'est pas toujours aussi facile que décrit dans les autres réponses. Il ne fonctionne qu'avec les anciennes clés PEM. Nouveau format openssh des clés (généré avec -o option, plus sécurisée, puisque openssh-6.5) est identique si vous vérifiez les en-têtes:

$ head rsa_enc
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jYmMAAAAGYmNyeXB0AAAAGAAAABCYdi7MhY
$ head rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn

Dans ce cas, la manière la plus simple consiste à exécuter une opération sur eux à l'aide de ssh-keygen. S'il demande un mot de passe, il en a un ( ou ce n'est pas une clé ssh ), sinon il n'a pas de mot de passe:

$ ssh-keygen -yf rsa_enc
Enter passphrase: 
$ ssh-keygen -yf rsa
ssh-rsa AAAAB3NzaC1y...

L'exemple suivant est peut-être encore meilleur, car il ne demande pas d'entrée: -P spécifie la phrase secrète à utiliser, une clé non protégée s'ouvre avec une phrase secrète vide.

$ ssh-keygen -y -P "" -f rsa_enc
Load key "path_to_key": incorrect passphrase supplied to decrypt private key`
$ ssh-keygen -y -P "" -f rsa
ssh-rsa AAAAB3NzaC1y...
50
Jakuje

La "clé RSA" est en fait un ensemble de valeurs stockées sous forme de structure ASN.1 au format binaire DER normalisé, puis encodées en base-64 pour obtenir le fichier PEM final.

Un moyen très simple de déterminer si une clé est codée ou non consiste simplement à vérifier si l'en-tête ASN.1 est présent, et cela est généralement aussi simple que de vérifier si la "clé" commence par les lettres MII as dans l'exemple ci-dessous:

----- COMMENCER LA CLÉ PRIVÉE RSA -----
MII CWwIBAAKBgQCWxk9djtgA/t7n6M8g1d2fk3exyCSu1uubpxUkoFLJBKjLYiaa
[...]
eCrpRFHxhPICHI4db + I8GZ9QDmlbCN/bl3BBNNTn3w ==
----- FIN DE LA CLÉ PRIVÉE RSA -----

Dans les fichiers protégés par mot de passe, toute la structure ASN.1 étant cryptée, tout apparaît sous forme de caractères aléatoires.

16
WhiteWinterWolf

Les clés privées doivent être sécurisées, en essayant de définir le mot de passe, il suffit de déclarer s'il est encore protégé par mot de passe. Avec ssh-keygen sur la clé protégée:

~/.ssh$ ssh-keygen -p -f id_rsa_password_protected
Enter old passphrase:

Et avec non protégé:

~/.ssh$ ssh-keygen -p -f id_rsa_not_protected
Enter new passphrase (empty for no passphrase):

Donc, s'il n'est pas protégé par mot de passe, juste définissez le mot de passe.

7
santiagopim