Utilisation de openSSL pour échanger de manière sécurisée

Dans cet exercice, vous allez effectuer un échange sécurisé d’informations grâce à des opérations de chiffrement et de déchiffrement symétriques et asymétriques. Ces opérations manuelles sont complexes, coûteuses en temps et sujettes à erreur. D’où la nécessité de disposer d’une infrastructure de gestion de clés (PKI)

Préparation

  • Vous aurez besoin d’une machine virtuelle Linux (type Debian par exemple)
  • Dans le répertoire /home de stagiaire, créer 3 sous dossiers : « /home/alice », « /home/bob » et « /home/ac »

Etape 1 : génération des clés cryptographiques et certificats

Étape 1.a – Alice génère une clé privée

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:3 -out privkey-A.pem
  • genpkey ➝ génère une clé privée
  • -algorithm RSA ➝ utilise l’algo RSA (peut aussi accepter “EC” pour courbes elliptiques)
  • -pkeyopt opt:value ➝ permet de donner une valeur optionnelle (voir ci-dessous)
  • rsa_keygen_bits:2048 ➝ définit la taille de la clé à 2048 bits (le défaut est à 1024)
  • rsa_keygen_pubexp:3 ➝ exposant public « e » à 3 (défaut est 65, 537)
  • -out privkey-A.pem ➝ ecrit le fichier de sortie privkey-A.pem

Étape 1.b – Alice génère une clé publique

openssl pkey -in privkey-A.pem -pubout -out pubkey-A.pem
  • pkey ➝ process la clé publique ou privée
  • -in privkey-A.pem ➝ lit la clé depuis le nom de fichier privkey-A.pem
  • -pubout ➝ génère une clé publique (par défaut, la sortie est une clé privée)

Optionnel : visualisation des clés en clair

Les clés sont enregistrées en base64 et ne sont pas lisibles si vous les ouvrez dans un éditeur de texte ou dans le terminal. Heureusement, openssl nous fournit un ensemble de commandes pour les convertir en texte. Le flag (-noout) empêche également la commande d’imprimer l’encodage base64.

openssl pkey -in privkey-A.pem -text -noout
openssl pkey -pubin -in pubkey-A.pem -text -noout

Notez la différence de taille entre la clé privée et la clé publique (l’une est un sous-ensemble de l’autre). Il y a quelques valeurs supplémentaires stockées dans la clé privée que vous ne reconnaîtrez pas (exposant1, exposant2 et coefficient). Ceux-ci sont stockés par openssl pour accélérer le déchiffrement.

Étape 1.c – Alice génère une demande de signature de certificat

openssl req -new -key privkey-A.pem -out A-req.csr
  • req ➝ crée et gère une CSR (Certificate Signing Request
  • -new ➝ génère une nouvelle CSR, va demander des informations à Alice
  • -key privkey-A.pem ➝ Signe la requête avec la clé privée d’Alice

La commande posera ces questions à Alice :

  • Code pays [C]
  • Nom de la province/État [ST]
  • Ville/Lieu [L]
  • Nom de l’organisation [O]
  • Nom de l’unité organisationnelle [UO]
  • Common Name [CN]
  • Adresse email
  • Un mot de passe de challenge []

Étape 1.d – L’AC génère et signe un certificat pour Alice

Générer un certificat auto-signé pour l’AC

Répéter les étapes 1a et 1b pour l’AC (dans le crépertoire de l’AC), en adaptant les noms de fichier, puis générer un certificat auto-signé d’AC avec la commande suivante:

openssl req -x509 -new -nodes -key privkey-AC.pem -sha256 -days 1024 -out AC.crt

L’AC génère et signe un certificat pour Alice

openssl x509 -req -in A-req.csr -CA ../ac/AC.crt -CAkey ../ac/privkey-AC.pem -CAcreateserial -out A.crt -days 500 -sha256
  • x509 ➝ un utilitaire de certificat x509 (affiche, convertit, édite et signe les certificats x509)
  • -req ➝ une demande de certificat est prise en entrée (la valeur par défaut est un certificat)
  • -CA root.crt ➝ spécifie le certificat CA à utiliser comme émetteur du certificat d’Alice
  • -CAkey rootkey.pem ➝ spécifie la clé privée utilisée dans la signature (rootkey.pem)
  • -CAcreateserial ➝ crée un fichier de numérique contenant un compteur du nombre de certificats qui ont été signés par cette autorité de certification
  • -days 500 ➝ fait expirer le certificat d’Alice dans 500 jours
  • -sha256 ➝ spécifie l’algorithme de hachage à utiliser pour la signature du certificat

Optionnel: afficher le certificat sous forme de texte

openssl x509 -in Alice.crt -text -noout

Etape 2 : Alice tente de chiffrer un fichier avec la clé publique : Echec !

Étape 2.a – Alice vérifie le certificat public de Bob

Attention : ne pas oublier de répéter pour Bob les actions faites pour Alice :

openssl req -new -key privkey-B.pem -out B-req.csr
openssl x509 -req -in B-req.csr -CA ../ac/AC.crt -CAkey ../ac/privkey-AC.pem -CAcreateserial -out B.crt -days 500 -sha256

Puis Alice peut vérifier le cert de Bob

openssl verify -CAfile ../ac/AC.crt ../bob/B.crt

Étape 2.b – Alice extrait la clé publique de Bob

openssl x509 -pubkey -in ../bob/B.crt -noout > pubkey-B.pem

-pubkey ➝ affiche la clé publique du certificat (au format PEM)

Étape 2.c – Alice essaie de chiffrer son fichier largefile.txt avec la clé publique de Bob

Si besoin de générer un fichier aléatoire largefile.txt de 10 MB, utiliser cette commande :

head -c 10M </dev/urandom > largefile.txt

puis :

openssl pkeyutl -encrypt -in largefile.txt -pubin -inkey pubkey-B.pem -out ciphertext.bin
  • pkeyutl ➝ utilitaire pour effectuer des opérations de clé publique
  • -encrypt ➝ chiffre les données d’entrée
  • erreur ! (rappel : RSA n’est pas destiné à chiffrer des fichiers volumineux – Alice doit utiliser le chiffrement à clé symétrique pour cela)

Etape 3 : Génération de clé symmétrique, chiffrement et envoi

Étape 3.a – Alice génère une clé symétrique

openssl rand -base64  -out symkey.pem 32

Étape 3.b – Alice chiffre symkey.pem en utilisant la clé publique de Bob

openssl pkeyutl -encrypt -in symkey.pem -pubin -inkey pubkey-B.pem -out symkey.enc

Étape 3.c – Alice hache symkey.pem et le chiffre à l’aide de sa clé privée

openssl dgst -sha1 -sign privkey-A.pem -out signature.bin symkey.pem
  • dgst -sha1 ➝ hacher le fichier d’entrée en utilisant l’algorithme sha1
  • -sign privkey-A.pem ➝ signe le hachage avec la clé privée spécifiée
  • symkey.pem ➝ le fichier d’entrée à hacher

Etape 4 : Réception de la clé symétrique et vérification

Étape 4.a – Bob déchiffre symkey.enc en utilisant sa clé privée

(d’abord, copier symkey.enc et signature.bin dans le répertoire bob pour simuler l’envoi depuis Alice vers Bob)

openssl pkeyutl -decrypt -in symkey.enc -inkey privkey-B.pem -out symkey.pem

Étape 4.b – Bob obtient et vérifie le certificat d’Alice et extrait sa clé publique

Ceci est simplement une répétition de ce qu’Alice a fait à l’étape 2b, mais cette fois-ci pour Bob :

openssl x509 -pubkey -in ../alice/A.crt -noout > pubkey-A.pem

Étape 4.c – Bob vérifie que le message provient d’Alice

openssl dgst -sha1 -verify pubkey-A.pem -signature signature.bin symkey.pem
  • -verify pubkey-A.pem ➝ vérifie la signature en utilisant le nom de fichier spécifié
  • -signature signature.bin ➝ spécifie la signature à vérifier
  • symkey.pem ➝ le fichier à hacher

Etape 5 : Echange de message sécurisé

Étape 5.a – Alice chiffre son largefile.txt avec la clé symétrique

openssl enc -aes-256-cbc -pass file:symkey.pem -p -md sha256 -in largefile.txt -out ciphertext.bin
  • enc -aes-256-cbc ➝ chiffrer un fichier à l’aide de l’algorithme à clé symétrique aes-256-cbc
  • -pass file:symkey.pem ➝ spécifie le fichier à partir duquel obtenir la clé symétrique
  • -p ➝ imprime la clé, le sel, le vecteur d’initialisation à l’écran
  • -md sha256 ➝ utilise sha256 dans le cadre de la fonction de dérivation de clé (une fonction qui dérive une ou plusieurs clés secrètes secondaires à partir d’une clé secrète primaire)

Étape 5.b – Bob déchiffre ciphertext.bin avec la même clé symétrique

(d’abord, copier ciphertext.bin dans le répertoire bob pour simuler l’envoi depuis Alice vers Bob)

openssl enc -aes-256-cbc -d -pass file:symkey.pem -p -md sha256 -in ciphertext.bin -out largefile.txt

-d pour déchiffrer