OpenSSL Overview and Implementation

Cryptography and Network Security · notes

Voir tous les documents en sécurité informatique

OpenSSL

OpenSSL

OpenSSL est une boîte à outils cryptographiques implémentant les protocoles SSL et TLS qui

Offre

* Une bibliothèque de programmation en C permettant de réaliser des applications client/serveur sécurisées s’appuyant sur SSL/TLS. * Une commande en ligne (OpenSSL) permettant : + la création de clés RSA, DSA (signature) + la création de certificats X509 + le calcul d’empreintes (MD5, SHA, RIPEMD160, ...) + le chiffrement et déchiffrement (RSA, DES, IDEA, RC2, RC4, Blowfish, ...) + la réalisation de tests de clients et serveurs SSL/TLS + la signature et le chiffrement de courriers (S/MIME)

Pour connaître toutes les fonctionnalités de openSSL : man openssl.

Installation sous Ubunto

**Apt-get install openssl**

Répertoire de travail

**/etc/ssl**

Chiffrement asymétrique avec OpenSSL (RSA)

Génération des clés

On peut générer une paire de clés RSA avec la commande :

**$openssl genrsa –out <fichier> <taille en bit>**

Par exemple :

*$openssl genrsa –out macle.pem 1024*

Le fichier obtenu est un fichier au format PEM (Privacy Enhanced Mail, format en base 64), dont voici un exemple :

*-----BEGIN RSA PRIVATE KEY-----*

*MIICXgIBAAKBgQDA6nzyERl8yUQBur0/GyF5fc/fllnHiZZytY/peu/6HPMJvji0*

*3dOqDK27mb9GtSqr7S9G4ClX/VKKekMJtcN6n2YNBp0OydyOYaZadrI/SaqDjrqB*

*HtZ4//H6BKs24kC2kJHABG+CZpM1U6pIHwX6rBjuxi4VZuOPvz1nrJfhWQIDAQAB*

*AoGAQYNgSxRjg20WG0A/ZF7iT0/aeCOm+YxP+0SNSszlEhsirfxbZZCvgOAtX7gm*

*rOx5QUma9IbLg4YTsdMzUOjZKQRU7Al5AHGl2Xt5Qit/dCNkq5MMEra3rfKq5tpQ*

*+20NUA8xya1wAEUkwgIv6+aehyNsPk/Jpdi+tLWRWrsc+MECQQDlY1uER+gdYqAY*

*i3PRBVHnvlmdrPJAfoACyeyyOGaZnUe7UlLOQJ8jU46+sLYvKd9sIAo4QoWuJQLi*

*ibla8SlXAkEA10vv6s89X0qBImzTc8grXw+C7ab7PHPkoB1EqH08494szX8vwEk7*

*W9opiekHR4br7dn0PlK+QZ4wPZ8QoxeszwJBAKcGudSQJ0t+TOSSZjqEjScZS1es*

*Xpjng36EWX1L5ClmhJy5TOIx2651YTMoqP+elbi9e7OLfJtZB8i8T+MQRvECQQCO*

*PgKFzWQL6CqHNwVBUres94+WOiN1HlCnpI6vDwdCuZA6ONSwovGPzwRwtD/19uM7*

*YyumXX6L1dqja8tPJZ4rAkEAgjplY0rEkgFaszTIy7giULTaJwpGMhomepkvYnM4*

*iL8JB2iy8PgYM4a54ykB1DFV00SajnG1VrpOGXI/RguYRw==*

Publicité

*-----END RSA PRIVATE KEY-----*

Visualisation des clés RSA

La commande RSA permet de visualiser le contenu d’un fichier au format PEM contenant une paire de clefs RSA :

**$openssl o**

* L’option *–text* demande l’affichage décodé de la paire de la paire de clefs. * L’option *–noout* supprime la sortie normalement produite par la commande rsa.

Il n’est pas prudent de laisser une paire de clef en clair, surtout l’accès physique et distant à la machine par une autre personne, risque de causer beaucoup de dégâts. Pour cela, openssl offre la possibilité de chiffrer la paire des clés avec la commande :

**$openssl rsa –in macle.pem –des3 –out macle.pem**

Une passephrase est demandée deux fois pour générer une clé symétrique protégeant l’accès à la clé.

Extraction de la partie publique

La partie publique d’une paire de clé devra être communiquée à n’importe qui. Le fichier

macle.pem contient la partie privée, et ne peut donc pas être communiquée tel quelle.

L’extraction de la partie publique est donnée par la commande :

**$openssl rsa –in macle.pem –pubout –out macle\_publique.pem**

Chiffrement et déchiffrement de données avec RSA

On peut chiffrer /déchiffrer les données avec les clés RSA :

**$openssl rsautl -encrypt –in fichier.txt -inkey tacle\_publique.pem –pubin –out fichier\_chiffre.txt**

**$openssl rsautl -decrypt –in fichie\_chiffre.txt -inkey macle.pem –out fichier\_clair.txt**

***Attention :*** le fichier des données à chiffrer ne doit pas avoir une taille excessive (ne doit pas

dépasser 116 octets pour une clé de 1024 bits).

La signature numérique

Principe

Pierre crée un document, et il calcule une emprunte (via les algorithmes MD5 ou SHA) à partir de ce document. Il utilise ensuite sa clé privée pour chiffrer cette donnée. Il associe le résultat au document.

Chacun peut recalculer la somme de contrôle du document et vérifier avec la clé publique de Pierre que le document est authentique et que Pierre est l’auteur.

Exemple

Signer un document c’est crypter avec sa clé privée l’empreinte d’un fichier.

**$openssl dgst -md5 fichier.txt > fichier.emp**

**$openssl rsautl -sign –in fichier.emp -inkey cle.pem –out fichier.sig**

La vérification d’une signature consiste à déchiffrer la signature avec la clé publique. Ensuite on recalcule l’empreinte pour vérifier que le document n’a pas été modifié.

**$openssl rsautl -verify –in fichier.sig -inkey pub.pem –pubin**

**$openssl md5 fichier.txt**

On peut signer et vérifier un document directement

Publicité

**$openssl dgst -md5 –sign cle.pem –out fichier.sig fichier.txt**

**$openssl dgst -md5 –verify pub.pem -signature fichier.sig fichier.txt**

Les certificats X509

La notion de certificat

Un certificat est un document qui comprend essentiellement une clé publique et des renseignements sur le propriétaire de cette clé, le tout signé avec les clés privés d’organismes reconnus, des autorités ou CA (Certification Authorities). Un certificat permet de dialoguer de manière sûre (chiffrée) avec la personne ou la société qu’il décrit. Si l’on possède d’autres certificats décrivant les signataires, on a l’assurance de l’identité du propriétaire de la clé.

Les certificats X509

L’ISO a établi un protocole, baptisé X509, permettant l’authentification sur un réseau. Ce protocole utilise des certificats au format normalisé.

Les certificats X509 ont été utilisés au début pour la sécurisation du courrier électronique : PEM (Privacy Enhanced Mail), l’ancêtre de S/MIME, maintenant ils sont utilisés aussi bien dans la sécurisation du web (via SSL) que dans bien d’autres domaines.

Format d’un certificat X509

Les différents champs

* Version la version du protocole * Serial Number un numéro de série unique pour un CA * Algorithme Identifier l’algorithme utilisé pour la signature + Algorithm + Parameters * Issuer la CA qui a émis le certificat * Period of validity la période de validité + Not before date début + Not after date fin * Subject la personne identifiée par le certificat * Subject’s public key la clé publique + Algorithm + parameters + public key * signature la signature

Les formats des fichiers

Un certificat est stocké dans un fichier. Les formats les plus souvent utilisés sont les suivants :

DER : le format DER, de l’OSI, est le format binaire qui traduit l’ASN.1.

PEM : c’est un format ascii, codé Base 64. Le texte est encadré d’une ligne « BEGIN CERTIFICATE » et « END CERTIFICATE »

PKCS 7 : le standard RSA

PKCS12 : ce standard RSA est principalement utilisé pour les certificats des utilisateurs. Un fichier PKCS12 contient non seulement le certificat d’un utilisateur mais aussi sa clé privée normalement protégée par un mot de passe.

Description d’un sujet ou d’un CA

Ce sont les possesseurs de la clé publique.

* C (Country) : pays * S(State) ou P (Province): état ou province * L (Locality) : ville * (Organization) : société * OU (Organization Unit) : le service * CN (Common Name) : le nom du sujet ou l’adresse DNS du serveur * E (Email) : adresse e-mail

Gestion des certificats avec openssl

Créer une requête de certificat

**$openssl genrsa -out cle.pem 1024**

**$openssl req -new –key cle.pem -out req.cer**

**$openssl req -in req.cer -text**

Visualiser un certificat

**$more certif.pem**

**$openssl x509 -in certif.pem -text -noout**

Création d’un certificat racine

**$openssl x509 -req -in req.cer -signkey cle.pem -out cer.cer**

Jouer le rôle d’un CA : signer un certificat

Publicité

* Copier le fichier de configuration

**$ cp /usr/local/openssl.conf**

* Créer l’arborescence d’accueil

**$ mkdir demoCA**

**$ mkdir demoCA/newcerts**

**$ echo “01” > demoCA/serial**

**$ touch demoCA/index.html**

**$ mkdir demoCA/private**

**$ mv cle.pem demoCA/private/cakey.pem**

**$ mv cer.cer demoCA/cacert.pem**

* Signer une requête de certificat

**$ openssl ca -config openssl.cnf -in person.req -out person.cer**

Créer un certificat pour une personne

**$ openssl genrsa -out pers.key 1024**

**$ openssl req -new -key pers.key -out pers.req**

**$ openssl x509 -req -days 365 -CAcreateserial -CA cer.cer -CAkey cle.pem \**

**> -in pers.req -out req.cer**

**$ openssl pkcs12 -export -in pers.cer -inkey pers.key -out pers.pfx**

**$ openssl pkcs12 -in pers.pfx -out pers.pem**

**$ more pers.pem**

Signature de fichiers

Suite à la complexité des algorithmes de cryptographie asymétrique, on signe toujours de petits documents. Pour signer un grand document, on calcule d’abord une empreinte de ce document. La commande dgst (digest) permet de le faire.

**$openssl dgst <hachage> -out resultat\_hachage fichier.txt**

Signer un document revient à signer son empreinte. Pour cela, on utilise l’option *–sign* de la

commande *rsautl :*

**$openssl rsautl –sign –in resultat\_hachage –inkey <clé> -out signature**

Et pour vérifier la signature:

**$openssl rsautl –verify –in signature -out resultat\_hachage1 –pubin –inkey macle\_publique**