TP OpenSSL (PKI)
1 OBJECTIF DU TP
L’objectif du présent TP est de démontrer comment suivant la politique de sécurité définie dans une
entreprise, on peut définir des règles pour le pare-feu (firewall) iptables dans un environnement linux.
2 PRESENTATION DE QUELQUES CONCEPTS ET OUTILS UTILISES
2.1 PROTOCOLE SSL
Le protocole SSL (Secure Socket Layer) a été développé par la société Netscape Communications
Corporation pour permettre aux applications client/serveur de communiquer de façon sécurisée. TLS
(Transport Layer Security) est une évolution de SSL réalisée par l'IETF. La version 3 de SSL est utilisée par
les navigateurs tels Netscape et Microsoft Internet Explorer depuis
leur version 4. SSL est un protocole qui s'intercale entre TCP/IP et les applications qui s'appuient sur TCP.
Une
session SSL se déroule en deux temps
1. une phase de poignée de mains (handshake) durant laquelle le client et le serveur s'identifient,
conviennent du système de chiffrement et d'une clé qu'ils utiliseront par la suite.
2. la phase de communication proprement dite durant laquelle les données échangées sont compressées,
chiffrées et signées.
L'identification durant la poignée de mains est assurée à l'aide de certificats X509.
2.2 OPENSSL
OpenSSL est une boîte à outils cryptographiques implémentant les protocoles SSL et TLS qui offre
1. une bibliothèque de programmation en C permettant de réaliser des applications client/serveur
sécurisées s'appuyant sur SSL/TLS.
2. 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 (DES, IDEA, RC2, RC4, ...)
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. La syntaxe générale de la commande
openssl est
$ openssl <commande> <options>
(Le $ est le prompt du Shell)
Dans le texte qui suit, les commandes invoquant openssl supposent que cette commande est dans votre
PATH.
3 PREREQUIS POUR LE TP
Une distribution de linux en mode administrateur
CA (Certification Authority)
- Mot de passe : intermediate
4 DEROULEMENT
4.1 GENERATION D'UNE PAIRE DE CLES
On peut générer une paire de clés RSA avec la commande genrsa d’openSSL.
$ openssl genrsa -out <fichier > <taille>
où fichier est un nom de fichier de sauvegarde de la clé, et taille et la taille souhaitée (exprimée en bits)
du modulus de la clé.
Par exemple, pour générer une paire de clés de 1024 bits, stockée dans le fichier [Link], on exécute
la commande
$ openssl genrsa -out [Link] 1024
Le fichier obtenu est un fichier au format PEM (Privacy Enhanced Mail, format en base 64)
4.2 VISUALISATION DES CLES RSA
La commande rsa permet de visualiser le contenu d'un fichier au format PEM contenant une paire de clés
RSA.
$ openssl rsa -in <fichier > -text -noout
L'option -text demande l'affichage décodé de la paire de clés. L'option -noout supprime la sortie
normalement produite par la commande rsa.
Les différents éléments de la clé sont affichés en hexadécimal (hormis l'exposant public). On peut
distinguer le modulus, l'exposant public (qui par défaut est toujours 65537), l'exposant privé, les nombres
premiers facteurs du modulus, plus trois autres nombres qui servent à optimiser l'algorithme de
déchiffrement.
4.3 CHIFFREMENT D'UN FICHIER DE CLES RSA
Il n'est pas prudent de laisser une paire de clés en clair (surtout la partie privée). Avec la commande rsa,
il est possible de chiffrer une paire de clés. On utilisera le chiffrement aes256
$ openssl rsa -in [Link] -aes256 -out [Link]
Une phrase de passe est demandée deux fois pour générer une clé symétrique protégeant l'accès à la clé.
Avec la commande cat observez-le contenu du fichier [Link]. Utilisez à nouveau la commande rsa
pour visualiser le contenu de la clé.
4.4 EXPORTATION DE LA PARTIE PUBLIQUE
La partie publique d'une paire de clés RSA est publique, et à ce titre peut être communiquée à n'importe
qui. Le fichier [Link] contient la partie privée de la clé, et ne peut donc pas être communiqué tel
quel (même s'il est chiffré). Avec l'option -pubout on peut exporter la partie publique d'une clé.
$ openssl rsa -in [Link] -pubout -out [Link]
Notez le contenu du fichier [Link]. Remarquez les marqueurs de début et de fin.
4.5 CHIFFREMENT/DECHIFFREMENT DE DONNEES AVEC RSA
On peut chiffrer des données avec une clé RSA. Pour cela on utilise la commande rsautl
$ openssl rsautl -encrypt -in <fichier_entree > -inkey <clé > -out <fichier_sortie >
Où
fichier_entree est le fichier des données à chiffrer. 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).
clé est le fichier contenant la clé RSA. Si ce fichier ne contient que la parte publique de la clé, il
faut rajouter l'option -pubin.
fichier_sortie est le fichier de données chiffré.
Pour déchiffrer on remplace l'option -encrypt par -decrypt. Le fichier contenant la clé doit évidemment
contenir la partie privée.
4.6 SIGNATURE DE FICHIERS
Il n'est possible de signer que de petits documents. Pour signer un gros document on calcule d'abord une
empreinte de ce document. La commande dgst permet de le faire.
$ openssl dgst <hachage> -out <fichier_empreinte> <fichier_entree >
où hachage est une fonction de hachage. Avec openssl, plusieurs fonctions de hachage sont proposées
dont
MD5 (option -md5), qui calcule des empreintes de 128 bits,
SHA1 (option -sha1), qui calcule des empreintes de 160 bits,
RIPEMD160 (option -ripemd160), qui calcule des empreintes de 160 bits
Signer un document revient à signer son empreinte. Pour cela, on utilise l'option -sign de la commande
rsautl
$ openssl rsautl -sign -in <empreinte> -inkey <cle > -out <signature >
et pour vérifier la signature
$ openssl rsautl -verify -in <signature > -pubin -inkey <cle > −out <empreinte>
Il reste ensuite à vérifier que l'empreinte ainsi produite est la même que celle que l'on peut calculer.
L'option -pubin indique que la clé utilisée pour la vérification est la partie publique de la clé utilisée pour
la signature.
4.7 CRÉATION D'UNE REQUÊTE DE CERTIFICATS
Maintenant que vous disposez d'une clé RSA, vous allez établir une requête pour obtenir un certificat.
Outre la clé publique, un certificat contient un certain nombre d'informations concernant l’identité de
son propriétaire :
- Pays (CM),
- État ou province (Centre)
- Ville ou localité (Yaounde)
- Organisation (MINPOSTEL)
- Unité (Formation)
- Nom (fse2)
- Email
Toutes ces informations et d'autres encore sont demandées lors de la création de la requête. Un fichier
de configuration peut-être défini qui propose les informations à apporter dans le certificat avec des
valeurs par défaut (fournit dans l’autorité de certification). On établit une requête avec la commande
req d’openssl.
$openssl req -config /root/ca/intermediate/[Link] -new -key [Link] -sha256 -out
[Link]
4.8 DEMANDE DE SIGNATURE DE CERTIFICAT
Une fois que vous avez établi une requête de certificat, il vous reste à contacter une autorité de
certification qui vous délivrera un certificat signé, après avoir procédé (normalement) à quelques
vérifications vous concernant.
Vous jouerez dans ce TP le rôle de l'autorité de certification. Pour cela il vous faut un certificat d'autorité
de certification, ainsi qu'une paire de clés. Vous utiliserez le certificat qui vous a été remis.
Pour visualiser le contenu d'un certificat
$ openssl x509 -in /root/ca/intermediate/certs/[Link] -text -noout
Exercice 11. Après avoir récupéré le certificat de l'autorité, ainsi que sa paire de clés RSA, cherchez
quelle est la date d'expiration du certificat et la taille de la clé.
Création d'un certificat Pour créer et signer un certificat à partir d'une requête [Link],
l'autorité invoque la commande ca.
Copiez la requête dans /root/ca/intermediate/csr/ et exécutez la commande suivante
$ cp [Link] /root/ca/intermediate/csr/
$ openssl ca -config /root/ca/intermediate/[Link] -extensions server_cert -days 375 -
notext -md sha256 -in /root/ca/intermediate/csr/[Link] -out
/root/ca/intermediate/certs/[Link]
$ chmod 444 /root/ca/intermediate/certs/[Link]
dans laquelle
- l'option -days détermine la durée de validité du certificat (ici 10 jours) ;
- [Link] est le fichier de configuration de l’autorité de certification intermédiaire.
- Extensions défini le type de certification à signer (serveur, authentificateur,…).
4.9 VERIFICATION DE CERTIFICATS
On peut vérifier la validité d'un certificat avec la commande verify. Pour vérifier la validité d'un
certificat, il est nécessaire de disposer du certificat de l'autorité qui l'a émis.
$ openssl verify -CAfile /root/ca/intermediate/certs/[Link]
/root/ca/intermediate/certs/[Link]
4.10 SIGNATURE DE COURRIERS ELECTRONIQUES
Vous disposez d'un certificat [Link], d'une clé privée [Link] et vous voulez envoyer un
courrier signé dont le contenu est dans le fichier [Link] à l'adresse haha@[Link]. En supposant que
tous les fichiers se trouvent dans le répertoire courant, il suffit d'invoquer la commande
$ openssl smime -sign -in [Link] -text -signer [Link] -inkey [Link] -from
moi@[Link] -to haha@[Link] -subject " courrier signe " -out mailsigne
4.10.1 Vérification de courriers signés
Pour vérifier un courrier signé, il faut disposer du certificat que l'émetteur a utilisé pour signer, ainsi que
celui de l'autorité ayant émis ce certificat. On invoque la commande
$ openssl smime -verify -in [Link] -CAfile /root/ca/intermediate/certs/ca-
[Link]