• 8 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 03/01/2024

Sécurisez vos connexions avec TLS

Vous savez sans doute que le petit cadenas vert sur la barre d'adresse d'un navigateur web signifie que la connexion est sécurisée avec le protocole HTTPS. Dans ce chapitre, vous allez apprendre comment fonctionne ce protocole basé sur TLS.

Découvrez le protocole TLS

Le protocole TLS (Transport Layer Security) est le protocole cryptographique le plus utilisé pour sécuriser les connexions réseaux. C'est le successeur du protocole SSL. Ce protocole permet de garantir :

  • la confidentialité des données avec le chiffrement symétrique ;

  • l'intégrité des données avec un code MAC ;

  • l'échange d'une clé de session avec le chiffrement asymétrique ;

  • l'authentification du serveur avec les certificats signés par une autorité de certification.

Découvrez le protocole HTTPS

L'usage le plus courant de TLS est en association avec HTTP pour former le protocole HTTPS (HTTP over TLS).
D’abord, un petit rappel sur le protocole HTTP.

Le protocole HTTP est un protocole texte réseau encapsulé dans la suite de protocoles Internet TCP/IP de la manière suivante : IP(TCP(HTTP)). Le protocole HTTP n'applique aucune sécurité : les données sont envoyées en clair et sans contrôle d'intégrité. Les données échangées en HTTP peuvent être lues et modifiées par n'importe qui sur le réseau Internet.

 Et c’est donc ce que permet HTTPS, c’est ça ?

Oui ! HTTPS authentifie et chiffre les données HTTP avec TLS.  En HTTPS, le protocole TLS se place entre les protocoles TCP et HTTP comme ceci : IP(TCP(TLS(HTTP))). Ainsi, toutes les données HTTP sont chiffrées et authentifiées, en particulier l'URL, les en-têtes HTTP, et le corps des requêtes et réponses HTTP.

HTTP VS HTTPS
HTTP VS HTTPS

Il existe plusieurs versions du protocole TLS. Les versions SSL ne sont plus considérées comme sécurisées. La version la plus utilisée de TLS actuellement est TLS 1.2. Il existe également une version plus récente, TLS 1.3, qui n'est pas encore très utilisée. La principale différence entre les versions est la liste des algorithmes cryptographiques utilisés, appelés suites cryptographiques.

Découvrez l'anatomie du protocole TLS

Une communication TLS est composée de 2 parties :

  • l'établissement de la liaison(TLS handshake) qui utilise la cryptographie à clé publique (chiffrement asymétrique et signature de certificat) ;

  • l'échange de données (TLS record) qui utilise la cryptographie symétrique (chiffrement symétrique et code MAC).

TLS handshake

Le protocole TLS handshake s'effectue une fois au début de la communication. Il utilise la cryptographie asymétrique pour échanger une clé de session.

  1. Avant la communication, le client fait confiance au certificat d'un CA racine et le serveur possède un certificat signé par le même CA racine. C'est la PKI HTTPS.

  2. Le client démarre la connexion avec une requête "Client Hello" en clair contenant les versions de TLS et les algorithmes de chiffrement qu'il est capable d'utiliser. 

  3. Le serveur répond avec une requête "Server Hello" en clair contenant la version de TLS choisie parmi celles proposées par le client, ainsi que son certificat X509 contenant sa clé publique et signée par un CA racine.

  4. Le client vérifie la signature du certificat avec la clé publique du CA racine. Si le certificat est expiré ou n'est pas signé par un CA de confiance, le navigateur affiche une erreur. Si le certificat est validé, le client génère une clé secrète symétrique (appelée clé de session) avec un GNPA issu de l'entropie.

  5. Le client chiffre la clé de session avec la clé publique du serveur et la lui transmet.

  6. Le serveur déchiffre la clé de session avec sa propre clé privée.

  7. Le client et le serveur partagent maintenant une clé de session symétrique.

TLS record

  1. Le client chiffre la requête HTTP avec la clé de session et calcule le code MAC. Il envoie cette requête chiffrée au serveur.

  2. Le serveur déchiffre la requête avec la clé de session et vérifie le code MAC.

  3. Il traite la requête HTTP, puis il chiffre la réponse HTTP avec la clé de session et calcule le code MAC.

  4. Il envoie cette réponse chiffrée au client qui la déchiffre à son tour et affiche le site Internet. Si le client envoie une autre requête HTTP, il répète les opérations. 

Créez un certificat autosigné avec OpenSSL

Si vous avez besoin d'aide pour installer et configurer un serveur web Apache, vous pouvez vous référer au cours OpenClassrooms dédié

Installez Apache

Ouvrez le terminal et entrez :

sudo apt-get install apache2

Créez une paire de clés et un certificat autosigné avec OpenSSL :

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-autosigne.key -out /etc/ssl/certs/apache-autosigne.crt

Quelques explications sur la commande :

  • openssl req -x509. Demande à OpenSSL de créer un certificat de type x509 autosigné ;

  • nodes. Option pour ne pas chiffrer la clé privée avec un mot de passe, pour qu'Apache puisse utiliser la clé privée sans intervention utilisateur ;

  • days 365. Durée de validité du certificat, d'un an ;

  • newkey rsa:2048. Option pour générer une nouvelle paire de clés pour le certificat, en utilisant le système RSA avec une clé de 2 048 bits ;

  • keyout /etc/ssl/private/apache-autosigne.key. Emplacement où sera stockée la clé privée générée ;

  • out /etc/ssl/certs/apache-autosigne.crt. Emplacement où sera stocké le certificat, qui contient la clé publique générée.

Vous pouvez laisser les informations par défaut demandées par OpenSSL lors de la génération du certificat en appuyant sur Entrée.

Le certificat autosigné est créé !  Il faut maintenant configurer Apache pour l'utiliser. Entrez la commande suivante pour ouvrir le fichier de configuration du Virtual Host TLS par défaut d'Apache :  

sudo gedit /etc/apache2/sites-available/default-ssl.conf

trouvez les lignes :

  • SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem

  • SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

et remplacez-les par le certificat et la clé privé que vous venez de créer :

  • SSLCertificateFile      /etc/ssl/certs/apache-autosigne.crt

  • SSLCertificateKeyFile /etc/ssl/private/apache-autosigne.key

Puis enregistrez et fermez le fichier.

Il faut ensuite activer le mod ssl d'Apache avec la commande :

sudo a2enmod ssl

puis activez le Virtual Host TLS d'Apache :

sudo a2ensite default-ssl

Redémarrez Apache :

sudo systemctl restart apache2

Vous pouvez maintenant tester en ouvrant votre navigateur, par exemple Firefox, et en visitant https://localhost

Le navigateur affiche un message d'erreur ?! 

C'est normal ! Le navigateur est configuré pour ne pas faire confiance aux certificats autosignés. Vous pouvez néanmoins ajouter une exception pour ce site en cliquant sur Avancé puisAjouter une exception puis Confirmer l'exception.

Vous pouvez maintenant visiter https://localhost grâce au certificat autosigné.

Un certificat autosigné est généralement utilisé en environnement local de développement, de test ou de préproduction.

Par ailleurs, le certificat racine d'une autorité de certification racine est autosigné, puisque c'est elle-même qui est chargée de signer les certificats ! Cependant, ce certificat fait partie des certificats de confiance des machines clientes, et est donc reconnu comme valide.

Créez un certificat signé avec Let's Encrypt

Par ailleurs, votre machine Linux doit maintenant être accessible sur Internet pour que l'autorité de certification signe votre certificat. Si vous utilisez une machine virtuelle, vous devez configurer  le Port Forwarding de votre box Internet pour qu'elle laisse passer les requêtes venant de l'extérieur sur les ports 80 et 443, et les redirige vers l'IP de votre machine Linux. Si vous utilisez une machine hébergée sur le Cloud, elle est normalement déjà accessible sur Internet.

Dans mon cas, j'utilise le nom de domaine occrypto.freeddns.org et une machine Ubuntu sur le Cloud hébergée sur Digital Ocean.

Comme votre serveur est maintenant accessible depuis Internet, vous allez d'abord configurer le firewall.

Pour activer le firewall d'Ubuntu, entrez la commande :

entrez sudo ufw enable

puis, pour ajouter une règle d'autorisation des connexions entrantes sur les port 80 (HTTP) et 443 (HTTPS), entrez :

sudo ufw allow 'Apache Full'

Ouvrez ensuite le fichier de configuration du Virtual Host TLS par défaut d'Apache :

sudo gedit /etc/apache2/sites-available/default-ssl.conf

Placez-vous sous la directive "ServerAdmin" et entrez :

ServerName [Votre nom de domaine]

pour moi c'est :

ServerName  occrypto.freeddns.org

Redémarrez Apache :

sudo systemctl restart apache2

Installez Certbot pour Apache. C'est un outil développé par l'autorité de certification Let's Encrypt, qui permet d'automatiser la création et la signature du certificat, et son utilisation par Apache.

Entrez la commande :

sudo apt install python-certbot-apache

Pour lancer la création du certificat entrez :

sudo certbot --apache -d [Votre nom de domaine]

pour moi c'est :

sudo certbot --apache -d occrypto.freeddns.org

Entrez votre adresse email pour être prévenu du renouvellement du certificat. Le certificat sera renouvelé automatiquement par Certbot avant son expiration, tous les 3 mois.

Entrez A pour accepter les conditions d'utilisation de Let's Encrypt.

Lorsque la vérification est validée, Let's Encrypt vous propose de configurer Apache pour rediriger automatiquement le site HTTP vers le site HTTPS. Vous pouvez accepter en entrant 2.

Apache utilise maintenant un certificat signé par Let's Encrypt ; vous pouvez le vérifier en utilisant votre navigateur pour visiter https://[VotreNomDeDomaine]. Cette fois le cadenas est vert. Si vous cliquez dessus, le navigateur confirme que le certificat est valide, et signé par Let's Encrypt.

Vous pouvez également visiter https://[VotreNomDeDomaine] depuis un autre ordinateur, le certificat sera aussi reconnu comme valide.

Vous savez maintenant utiliser openSSL et Let's Encrypt pour générer des certificats autosignés ou signés par une autorité de certification !

En résumé

  • TLS est un protocole réseau pour sécuriser les données échangées, utilisé notamment par HTTPS ; 

  • TLS utilise la cryptographie à clé publique lors du TLS Handshake pour valider la signature du certificat du serveur et pour échanger une clé secrète de session ; 

  • TLS utilise le chiffrement symétrique et un code MAC pour le TLS record, c'est-à-dire pour échanger les données au niveau de l'application ; 

  • le programme OpenSSL permet de générer des paires de clés et des certificats, notamment des certificats X509 autosignés

  • Let's Encrypt est une autorité de certification gratuite qui permet de créer un certificat signé pour authentifier un site web ; 

  • l'outil Certbot permet de recevoir facilement un certificat signé par Let's Encrypt, et de l'intégrer à un serveur web comme Apache. 

Exemple de certificat de réussite
Exemple de certificat de réussite