Certificat SSL/TLS
Sécurisation des communications entre un client et un serveur grâce au chiffrement
Notions théoriques
Les certificats SSL/TLS permettent de sécuriser les échanges entre un client (navigateur, application) et un serveur (site Web, API).
Ils garantissent la confidentialité et l'intégrité des données transmises en empêchant leur interception ou leur modification par des tiers.
Fonctionnement du protocole SSL/TLS
SSL (Secure Sockets Layer) et TLS (Transport Layer Security) sont des protocoles de chiffrement qui assurent la sécurisation des communications sur Internet.
TLS est une version améliorée et plus sécurisée de SSL.
Le fonctionnement du protocole SSL/TLS repose sur un système de chiffrement asymétrique et symétrique :
- Établissement de la connexion : Le client envoie une requête au serveur.
- Échange des clés : Le serveur envoie son certificat contenant une clé publique.
- Vérification du certificat : Le client vérifie que le certificat est valide et signé par une autorité de certification (CA).
- Établissement d'une clé de session : Une clé symétrique est générée pour chiffrer les échanges.
- Transmission sécurisée des données : Toutes les données échangées sont désormais chiffrées.
Chiffrement asymétrique et symétrique
Le chiffrement est une technique permettant de sécuriser des données en les rendant illisibles sans une clé spécifique. Il existe deux grandes catégories de chiffrement : le chiffrement symétrique et le chiffrement asymétrique.
Chiffrement symétrique
Le chiffrement symétrique repose sur une seule clé utilisée à la fois pour chiffrer et déchiffrer les données.
Principe :
- L'expéditeur chiffre un message avec une clé secrète.
- Le destinataire utilise la même clé pour déchiffrer le message.
Avantages :
- Rapide et efficace, adapté au chiffrement de grandes quantités de données.
Inconvénients :
- La clé doit être partagée entre l'expéditeur et le destinataire, ce qui pose un risque de sécurité (si elle est interceptée, le message peut être déchiffré).
Exemples d'algorithmes symétriques :
- AES (Advanced Encryption Standard)
- DES (Data Encryption Standard)
- ChaCha20
Chiffrement asymétrique
Le chiffrement asymétrique repose sur deux clés distinctes :
- Une clé publique, utilisée pour chiffrer les données.
- Une clé privée, utilisée pour déchiffrer les données.
Principe :
- L'expéditeur chiffre un message avec la clé publique du destinataire.
- Seul le destinataire, possédant la clé privée correspondante, peut déchiffrer le message.
Avantages :
- Permet d’échanger des données sans partager de clé secrète.
- Utilisé pour l'authentification et la signature numérique.
Inconvénients :
- Plus lent que le chiffrement symétrique en raison de la complexité des calculs mathématiques.
Exemples d'algorithmes asymétriques :
- RSA (Rivest-Shamir-Adleman)
- ECC (Elliptic Curve Cryptography)
- Diffie-Hellman (pour l’échange de clés)
Utilisation combinée des 2 méthodes de chiffrement
Dans de nombreux systèmes, le chiffrement asymétrique est utilisé pour échanger une clé secrète, qui est ensuite employée pour un chiffrement symétrique plus rapide. C'est le cas du protocole TLS/SSL, utilisé dans HTTPS, où :
- Le client et le serveur utilisent le chiffrement asymétrique pour échanger une clé de session.
- Cette clé de session est ensuite utilisée pour chiffrer les communications avec un algorithme symétrique.
Cette combinaison permet d’allier sécurité et performance.
Types de certificats SSL/TLS
Il existe plusieurs types de certificats SSL/TLS, adaptés à différents usages :
- Certificat à validation de domaine (DV) : Vérifie uniquement que le demandeur possède le domaine.
- Certificat à validation d'organisation (OV) : Vérifie l'identité de l'organisation propriétaire du site.
- Certificat à validation étendue (EV) : Apporte un niveau de confiance maximal (affichage du nom de l'entreprise dans la barre d'adresse).
- Certificat wildcard : Sécurise un domaine et tous ses sous-domaines.
- Certificat multi-domaines (SAN) : Protège plusieurs domaines avec un seul certificat.
Installation et configuration d'un certificat SSL/TLS
L'installation d'un certificat SSL/TLS implique plusieurs étapes :
- Génération d'une clé privée et d'une demande de signature de certificat (CSR).
- Envoi du CSR à une autorité de certification (CA) pour obtenir un certificat signé.
- Installation du certificat sur le serveur et configuration du serveur Web pour l'utiliser.
- Forçage des connexions HTTPS en redirigeant HTTP vers HTTPS.
Renouvellement et gestion des certificats
Les certificats SSL/TLS ont une durée de validité limitée (généralement 1 an). Il est essentiel de les renouveler avant expiration pour éviter les erreurs de sécurité.
Des outils comme Let's Encrypt permettent d'automatiser le renouvellement des certificats grâce au client Certbot.
Exemple pratique
Il est possible de sécuriser un site Web avec un certificat SSL/TLS gratuit de Let's Encrypt en utilisant Certbot.
Installation de Certbot et génération d'un certificat
- Installer Certbot sur un serveur Linux (Debian/Ubuntu) :
sudo apt update
sudo apt install certbot python3-certbot-apache
- Générer un certificat SSL pour un domaine :
sudo certbot --apache -d exemple.com -d www.exemple.com
- Vérifier l'installation du certificat :
sudo certbot certificates
Renouvellement automatique du certificat
- Tester le renouvellement automatique :
sudo certbot renew --dry-run
- Programmer le renouvellement avec
cron
:
echo "0 3 * * * certbot renew --quiet" | sudo tee -a /etc/crontab
Redirection automatique de HTTP vers HTTPS
- Modifier la configuration Apache :
sudo nano /etc/apache2/sites-available/000-default.conf
- Ajouter la redirection :
<VirtualHost *:80>
ServerName exemple.com
Redirect permanent / https://exemple.com/
</VirtualHost>
- Redémarrer Apache :
sudo systemctl restart apache2
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Objectif du TP
L'objectif de ce TP est de mettre en place un certificat SSL/TLS sur un serveur Apache en utilisant Let's Encrypt et Certbot, mais avec une configuration avancée :
- Utilisation d'un certificat multi-domaines (SAN).
- Configuration d'une redirection conditionnelle HTTP → HTTPS.
- Vérification et sécurisation des permissions des fichiers SSL.
Étape 1 : Installation de Certbot et des dépendances
Sur un serveur Linux (Debian/Ubuntu), commencer par installer Certbot et son module Apache.
Exécuter les commandes suivantes :
sudo apt update
sudo apt install certbot python3-certbot-apache
L'installation de Certbot est essentielle pour générer et gérer les certificats SSL/TLS de Let's Encrypt.
sudo apt update
met à jour la liste des paquets disponibles.sudo apt install certbot python3-certbot-apache
installe Certbot et son module Apache, qui permet une configuration automatique des certificats.
Une fois l'installation terminée, vérifier que Certbot est bien installé avec :
certbot --version
Cela doit afficher la version de Certbot installée.
Étape 2 : Génération d'un certificat SSL multi-domaines
Il est possible de générer un certificat SSL pour plusieurs domaines en une seule commande.
Exécuter la commande suivante en remplaçant exemple.com
et sousdomaine.exemple.com
par les noms de domaine réels :
sudo certbot --apache -d exemple.com -d sousdomaine.exemple.com
Cette commande demande un certificat SSL pour exemple.com
et sousdomaine.exemple.com
.
--apache
permet à Certbot de configurer automatiquement Apache.-d exemple.com -d sousdomaine.exemple.com
spécifie les domaines à inclure dans le certificat.
Certbot demandera une adresse e-mail et proposera d'activer la redirection HTTPS. Il faut accepter cette option.
Une fois la commande terminée, vérifier que le certificat a bien été généré avec :
sudo certbot certificates
Cela doit afficher les certificats installés avec leurs dates d'expiration.
Étape 3 : Configuration d'une redirection conditionnelle HTTP → HTTPS
Plutôt que de forcer toutes les connexions vers HTTPS, il est possible d'appliquer une redirection conditionnelle uniquement aux requêtes non sécurisées.
Modifier la configuration Apache :
sudo nano /etc/apache2/sites-available/000-default.conf
Ajouter ces lignes à l'intérieur du bloc <VirtualHost *:80>
:
<VirtualHost *:80>
ServerName exemple.com
ServerAlias sousdomaine.exemple.com
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
Enregistrer (CTRL+X
, puis Y
et Entrée
), puis redémarrer Apache :
sudo systemctl restart apache2
Cette configuration utilise mod_rewrite
pour rediriger uniquement les requêtes HTTP vers HTTPS.
RewriteEngine On
active le moteur de réécriture.RewriteCond %{HTTPS} !=on
vérifie si la connexion n'est pas sécurisée.RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
redirige la requête vers HTTPS tout en conservant l’URL d'origine.
Après modification, tester la redirection en accédant à http://exemple.com
dans un navigateur. L’URL doit automatiquement passer en https://exemple.com
.
Étape 4 : Vérification des permissions des fichiers SSL
Les fichiers de certificats SSL doivent être protégés pour éviter tout accès non autorisé.
Vérifier les permissions avec :
ls -l /etc/letsencrypt/live/exemple.com/
Si les permissions ne sont pas sécurisées, les ajuster avec :
sudo chmod 600 /etc/letsencrypt/live/exemple.com/privkey.pem
sudo chmod 644 /etc/letsencrypt/live/exemple.com/fullchain.pem
Les fichiers du certificat doivent être accessibles uniquement par les processus qui en ont besoin.
privkey.pem
contient la clé privée du certificat et doit être lisible uniquement par root (chmod 600
).fullchain.pem
contient la chaîne complète du certificat et peut être lisible par Apache (chmod 644
).
Vérifier que les permissions sont bien appliquées avec :
ls -l /etc/letsencrypt/live/exemple.com/
Étape 5 : Tester le renouvellement automatique du certificat
Les certificats Let's Encrypt expirent après 90 jours. Il est donc essentiel de tester le renouvellement automatique.
Exécuter la commande suivante :
sudo certbot renew --dry-run
La commande certbot renew --dry-run
simule le renouvellement du certificat sans réellement le modifier.
Si tout fonctionne correctement, ajouter le renouvellement automatique dans cron
:
echo "0 3 * * * certbot renew --quiet" | sudo tee -a /etc/crontab
Cela exécute certbot renew
chaque jour à 3h du matin sans afficher de sortie (--quiet
).
Étape 6 : Vérification finale et test HTTPS
Pour s'assurer que tout fonctionne correctement :
- Accéder au site via HTTPS dans un navigateur :
https://exemple.com
. - Vérifier que la connexion est sécuris ée (icône de cadenas dans la barre d'adresse).
- Tester le certificat avec la commande OpenSSL :
openssl s_client -connect exemple.com:443 -servername exemple.com
- Si le site est accessible en HTTPS avec un cadenas vert, cela signifie que le certificat est bien installé.
- La commande
openssl s_client -connect exemple.com:443 -servername exemple.com
permet d'afficher les détails du certificat et de vérifier qu'il est bien valide.
Si des erreurs apparaissent, consulter les logs Apache pour identifier les problèmes :
sudo journalctl -u apache2 --no-pager | tail -n 20