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

Déployer une PKI: Pourquoi et comment (3ème partie)

Si vous n’avez pas lu les 2 premiers articles de la série, n’hésitez pas à faire un tour ici et ici. Sinon, vous savez déjà qu’un projet de déploiement de PKI n’est pas que technique. Bienvenue pour ce dernier article de la série « Déployer une PKI ». Aujourd’hui, nous allons parler des 2 dernières étapes d’un projet de déploiement: le paramétrage et l’audit.

certificat numérique
Continuer la lecture de « Déployer une PKI: Pourquoi et comment (3ème partie) »

Déployer une PKI: Pourquoi et comment (2ème partie)

Dans l’épisode précédent…

Dans le précédent article, nous avons vu que la PKI a rendu le chiffrement, la signature et l’authentification transparentes pour les utilisateurs. Elle permet la gestion et la protection de certificats numériques. Le tout en vue de protéger l’information dématérialisée (chiffrement, signature, authentification, etc).

pki puzzle

Nous avons aussi vu la première étape d’un projet de déploiement d’une Infrastructure de Gestion de Clés: L’analyse et la conception. Durant cette étape, on apporte la réponse aux questions liées aux usages de la PKI, à la documentation qui sera mise en place, aux coûts, sécurité, architecture etc.

Voyons maintenant l’étape suivante:

Continuer la lecture de « Déployer une PKI: Pourquoi et comment (2ème partie) »

Déployer une PKI: Pourquoi et comment (1ère partie)

Cet article est le premier d’une série visant à aider le lecteur en vue d’un projet de déploiement d’une Infrastructure à Clés Publiques (PKI)

PKI

Introduction et définitions

Depuis toujours il a été nécessaire de protéger des informations sensibles. Il peut s’agir d’informations confidentielles qui ne doivent être connues que par certaines personnes. Mais aussi il y a ce besoin de garantir la provenance et l’intégrité d’une information. Voici quelques exemples parmi tant d’autres : Données militaires, contrats d’affaires, actes authentiques (notaire, avocat)…

Continuer la lecture de « Déployer une PKI: Pourquoi et comment (1ère partie) »