Comment générer une clé openSSL en utilisant une phrase de passe à partir de la ligne de commande?

107

Premièrement, que se passe-t-il si je ne donne pas de phrase secrète? Est-ce qu'une sorte de phrase pseudo aléatoire est utilisée? Je cherche juste quelque chose de "suffisamment bon" pour éloigner les pirates occasionnels.

Deuxièmement - comment générer une paire de clés à partir de la ligne de commande, en fournissant la phrase de passe sur la ligne de commande?


Je l'ai finalement fait fonctionner en utilisant ces commandes, en utilisant exec () qu'il est généralement considéré comme non sûr à utiliser, étant préférable de donner la PassPhrase dans un fichier. Je peux accepter ce risque car je suis sûr que PHP ne sera jamais exécuté que sur mon PC (qui exécute Windows et n'a pas de commande PS).

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 2048
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub

Un grand merci à @caf, sans qui cela n'aurait pas été possible.

Un seul regret - que, peu importe à quel point je Google, personne ne semble pouvoir openssl_pkey_new()travailler avec Xampp sous Windows (ce qui est la bonne façon de générer une paire de clés)

Mawg dit de réintégrer Monica
la source
4
pourquoi openssl_pkey_new()... la "bonne" façon de générer une paire de clés?
Jake Berger
Windows n'a pas (normalement) psmais depuis Vista, il awmic process get commandline
dave_thompson_085

Réponses:

210

Si vous n'utilisez pas de phrase de passe, la clé privée n'est chiffrée avec aucun chiffrement symétrique - elle est sortie complètement sans protection.

Vous pouvez générer une paire de clés, en fournissant le mot de passe sur la ligne de commande en utilisant un appel comme (dans ce cas, le mot de passe est foobar):

openssl genrsa -aes128 -passout pass:foobar 3072

Cependant, notez que cette phrase de passe peut être saisie par tout autre processus exécuté sur la machine à ce moment-là, car les arguments de ligne de commande sont généralement visibles par tous les processus.

Une meilleure alternative consiste à écrire la phrase secrète dans un fichier temporaire protégé par des autorisations de fichier et à spécifier que:

openssl genrsa -aes128 -passout file:passphrase.txt 3072

Ou fournissez la phrase de passe sur l'entrée standard:

openssl genrsa -aes128 -passout stdin 3072

Vous pouvez également utiliser un tube nommé avec l' file:option ou un descripteur de fichier.


Pour ensuite obtenir la clé publique correspondante, vous devez utiliser openssl rsa, en fournissant la même phrase de passe avec le -passinparamètre que celle utilisée pour chiffrer la clé privée:

openssl rsa -passin file:passphrase.txt -pubout

(Cela attend la clé privée chiffrée sur l'entrée standard - vous pouvez à la place la lire à partir d'un fichier en utilisant -in <file>).


Exemple de création d'une paire de clés privée et publique de 3072 bits dans des fichiers, avec la paire de clés privées chiffrée avec un mot de passe foobar:

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 3072
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub
caf
la source
+1 Génial, ça marche! Merci, si vous pouvez simplement aider un adolescent un peu plus, vous obtenez la réponse ... pourquoi cela ne fonctionnera-t-il pas? openssl rsa -in privkey.pem -pubout -passout pass: foobar -out pubkey.pem
Mawg dit de réintégrer Monica
ou, pour le dire autrement - comment la clé publique de votre commande (qui différait légèrement de la mienne). J'ai juste besoin d'une paire assortie. Ce n'est qu'une sécurité «juste assez bonne».
Mawg dit de réintégrer Monica
4
@Mawg: Votre opensslcommande génère la clé publique correspondant à la clé privée fournie - les clés publiques ne sont pas chiffrées (elles ne sont pas secrètes), donc l'utilisation -passoutn'a aucun sens. Vous souhaitez probablement l'utiliser -passinpour fournir la phrase de passe qui a été utilisée pour crypter la clé privée lors de la première étape. J'ai également ajouté quelque chose à la réponse.
caf
@caf, merci pour le bon retour (+1 encore). Cependant, je suis apparemment trop stupide pour être autorisé à utiliser OpenSSL. Je veux la clé dans un fichier et, pour une raison quelconque, openssl genrsa 2048 -aes128 -passout pass:foobar -out privkey.pemje ne le fais pas. Pouvez-vous s'il vous plaît me donner deux commandes - une pour générer la clé privée dans un fichier et une seconde pour générer la clé publique (également dans un fichier)? Désolé d'être une telle nuisance, mais j'ai joué avec et je ne peux tout simplement pas le faire fonctionner :-(
Mawg dit de réintégrer Monica
3
@Mawg: OpenSSL n'aime pas si le -outparamètre vient après le 2048- vraiment, c'est censé être la dernière chose sur la ligne de commande (j'ai mis à jour ma réponse en tant que telle). Voir le dernier exemple, je pense que c'est ce que vous voulez. Quant à AES-128, quelqu'un en qui j'ai confiance dans ces domaines le recommande plutôt qu'à AES-256.
caf
9

genrsaa été remplacé pargenpkey & lorsqu'il est exécuté manuellement dans un terminal, il vous demandera un mot de passe:

openssl genpkey -aes-256-cbc -algorithm RSA -out /etc/ssl/private/key.pem -pkeyopt rsa_keygen_bits:4096

Cependant, lorsqu'elle est exécutée à partir d'un script, la commande ne demandera pas de mot de passe, donc pour éviter que le mot de passe ne soit visible en tant que processus, utilisez une fonction dans un shellscript:

get_passwd() {
    local passwd=
    echo -ne "Enter passwd for private key: ? "; read -s passwd
    openssl genpkey -aes-256-cbc -pass pass:$passwd -algorithm RSA -out $PRIV_KEY -pkeyopt rsa_keygen_bits:$PRIV_KEYSIZE
}
Stuart Cardall
la source