Crypter le mot de passe temporaire à l'aide de la clé publique ssh

9

Je gère un bureau virtuel et notre personnel utilise à la fois des clés SSH et des mots de passe pour l'authentification. Si l'un de nos employés oublie son mot de passe, existe-t-il un moyen de crypter un mot de passe temporaire à l'aide de sa clé publique RSA ssh afin que je puisse lui envoyer par e-mail?

J'ai vu d'autres questions liées à celle-ci, mais les «réponses» recommandent généralement de ne pas utiliser les clés SSH publiques / privées pour effectuer le chiffrement / déchiffrement général et ne précisent pas réellement si cela est possible. Je voudrais savoir si c'est effectivement possible et quelles sont les étapes pour crypter puis décrypter le mot de passe.

David M. Syzdek
la source

Réponses:

8

J'ai finalement trouvé comment convertir une clé publique OpenSSH au format PEM sur un blog et j'ai réussi à chiffrer et à déchiffrer une chaîne à l'aide de ma clé privée / publique.

J'ai décrit les étapes que j'ai utilisées pour effectuer le chiffrement et le déchiffrement.

Pour crypter une chaîne:

# convert public key to PEM format
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8  > ~/.ssh/id_rsa.pub.pem

# encrypt string using public key
echo "String to Encrypt" \
   | openssl rsautl -pubin -inkey ~/.ssh/id_rsa.pub.pem -encrypt -pkcs \
   | openssl enc -base64 \
   > string.txt

Pour décrypter une chaîne (à partir d'un fichier):

openssl enc -base64 -d -in string.txt \
    | openssl rsautl -inkey ~/.ssh/id_rsa -decrypt

Puisque mon objectif est d'envoyer le mot de passe par e-mail, j'ai écrit un script extrêmement basique pour automatiser un peu les choses:

#!/bin/sh
if test "x${1}" == "x";then
   echo "Usage: ${0} <username>"
   exit 1
fi
SSHUSER=${1}
printf "Enter Password: "
read PASS1
echo ""
echo ""
ssh-keygen -f /home/${SSHUSER}/.ssh/id_rsa.pub -e -m PKCS8 \
    > /tmp/ssh-pubkey-${SSHUSER}.pem
echo 'cat << EOF |openssl enc -base64 -d |openssl rsautl -inkey ~/.ssh/id_rsa -decrypt'
echo "New Password: ${PASS1}" \
   | openssl rsautl -pubin -inkey /tmp/ssh-pubkey-${SSHUSER}.pem -encrypt -pkcs \
   | openssl enc -base64
echo "EOF"
echo ""
rm -f /tmp/ssh-pubkey-${SSHUSER}.pem

Je peux ensuite envoyer la sortie du script dans un e-mail pour que l'utilisateur le déchiffre.

Le script complet est disponible sur Github: https://gist.github.com/3078682

David M. Syzdek
la source
4

C'est possible car c'est juste une clé RSA. Utilisez openssl:

openssl rsautl -encrypt -inkey alice.pub >message.encrypted

J'ai coché cette question sur Unix / Linux SE.

Je dois dire que PGP est plus approprié pour cela.

Lucas Kauffman
la source
1
Le problème est que la clé publique SSH n'est pas dans un format reconnu par OpenSSL. J'avais besoin de savoir comment convertir la clé en quelque chose qui pourrait ensuite être utilisé par une boîte à outils comme OpenSSL.
David M. Syzdek
1

En général, oui, c'est possible. SHH ne fait que générer un module N et deux clés e (la clé publique) et d (la privée). Le mécanisme utilisé est généralement RSA ou DSA et les clés générées peuvent être utilisées pour le chiffrement. Tout ce que vous avez à faire est de les extraire du blob base64 qui est la clé publique, puis d'utiliser un programme approprié pour crypter les données avec ces clés. Vous pourriez être intéressé par Monkeysphere qui peut transférer entre le format de clé ssh et les clés gnupg. Cela devrait vous permettre également d'utiliser les clés pour le chiffrement.

Quelqu'un
la source
0

Normalement, on ne fait pas de «chiffrement en masse» avec des clés asymétriques. Mais cela n'a pas d'importance car vous ne devriez pas avoir affaire à ce niveau de détails. Utilisez une boîte à outils (openssl est très bien http://www.openssl.org/docs/apps/openssl.html ) pour faire le travail pour vous. Ce que vous voulez faire, c'est créer un message chiffré contenant le nouveau mot de passe temporaire et spécifier la paire de clés de l'utilisateur comme destinataire. Des exemples à gogo sur cette page: http://www.openssl.org/docs/apps/smime.html

RAM
la source