cyber / cybersecurite-fondamentale
Cryptographie asymétrique et TLS
Explication
Ce que vous allez apprendre
- Expliquer le principe d'une paire de clés publique/privée et en quoi il résout le problème de distribution du chiffrement symétrique
- Comprendre pourquoi TLS combine chiffrement asymétrique et symétrique (chiffrement hybride)
- Décrire les grandes étapes du handshake TLS 1.3 et le rôle du certificat
- Expliquer ce qu'apporte la forward secrecy en cas de compromission future d'une clé
- Diagnostiquer les erreurs de production les plus courantes (certificat expiré, chaîne incomplète, absence de HSTS)
Dans quel contexte ?
Un client signale que son navigateur affiche "Votre connexion n'est pas privée" en visitant le site d'une entreprise, un lundi matin. En quelques minutes, l'équipe découvre que le certificat TLS a expiré le week-end précédent, faute de renouvellement automatique. Comprendre le rôle du certificat dans le handshake TLS permet de diagnostiquer l'incident immédiatement, au lieu de chercher du côté du réseau ou du serveur applicatif.
Première étape : reprendre le problème resté ouvert. La leçon précédente s'est terminée sur une question sans réponse : comment partager une clé secrète sans qu'elle soit interceptée en chemin ? C'est exactement ce que la cryptographie asymétrique va résoudre.
Deuxième étape : l'astuce, une paire de clés liées. Au lieu d'une seule clé, on en génère deux, mathématiquement liées entre elles. L'une, publique, peut être diffusée à tout le monde sans risque. L'autre, privée, reste secrète et ne quitte jamais son propriétaire.
Pour bien visualiser, l'image du cadenas ouvert. Imaginez que vous envoyez à tout le monde des cadenas déjà ouverts, en gardant pour vous la seule clé qui les referme. N'importe qui peut fermer une boîte avec votre cadenas, mais seul vous pouvez la rouvrir ensuite.
Il reste un problème pratique : l'asymétrique est lent. Chiffrer directement de gros volumes de données avec de l'asymétrique serait bien trop coûteux en calcul. La solution s'appelle le chiffrement hybride.
Voici comment fonctionne le chiffrement hybride. On utilise l'asymétrique uniquement pour échanger une petite clé de session. Ensuite, tout le gros volume de données est chiffré avec cette clé via AES, l'algorithme symétrique vu à la leçon précédente. C'est exactement ce que fait TLS, le protocole derrière le cadenas HTTPS de votre navigateur.
Maintenant, entrons dans le détail du handshake TLS, étape par étape.
| Étape du handshake | Ce qui se passe |
|---|---|
| ClientHello | Le client propose les algorithmes qu'il supporte |
| ServerHello | Le serveur choisit une suite et envoie son certificat |
| Vérification | Le client valide le certificat via la chaîne de confiance |
| Dérivation de clé | Les deux parties calculent une clé de session éphémère |
Pourquoi ce mot "éphémère" compte autant. Il garantit ce qu'on appelle la forward secrecy : même si une clé venait à être compromise plus tard, les communications passées resteraient indéchiffrables, car chaque session utilise sa propre clé jetable.
Piège fréquent
Oublier de renouveler un certificat, ou laisser une chaîne de certificats incomplète. Dans les deux cas, la confiance de tous les clients est cassée d'un coup. Automatisez systématiquement ce renouvellement (Let's Encrypt + certbot en tâche cron) plutôt que de compter sur une intervention manuelle.
Prérequis
Cette leçon s'appuie directement sur le chiffrement symétrique (AES) vu à la leçon précédente : TLS l'utilise pour chiffrer le gros du trafic, une fois la clé de session négociée grâce à l'asymétrique.
Maintenant que la théorie de la cryptographie est posée, la suite du cours change complètement de terrain : place aux attaques applicatives concrètes, en commençant par l'une des plus anciennes et des plus dangereuses, l'injection SQL.
Commandes & code
Cryptographie asymétrique et TLS
Le chiffrement asymétrique utilise une paire de clés : une clé publique (partageable) et une clé privée (secrète), résolvant le problème de distribution de clé du symétrique.
# Algorithmes asymétriques
RSA : le plus répandu historiquement, clés >= 2048 bits (idéalement 3072/4096)
ECC (Elliptic Curve) : équivalent de sécurité avec des clés bien plus courtes (ex: P-256, Curve25519)
Ed25519 : signature basée sur courbe elliptique, rapide et sûre, standard moderne# Génération d'une paire de clés Ed25519 et signature d'un message
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
from cryptography.hazmat.primitives import serialization
private_key = Ed25519PrivateKey.generate()
public_key = private_key.public_key()
message = b"licence-technologik-v1;user=42;exp=2026-12-31"
signature = private_key.sign(message)
# Vérification côté client/serveur distant, avec seulement la clé PUBLIQUE
try:
public_key.verify(signature, message)
print("signature valide, message authentique")
except Exception:
print("signature invalide, message altéré ou forgé")# Chiffrement hybride : RSA/ECC pour échanger une clé de session, puis AES pour les données
# (l'asymétrique est trop lent pour chiffrer de gros volumes directement)
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes
private_key = rsa.generate_private_key(public_exponent=65537, key_size=3072)
public_key = private_key.public_key()
session_key = os.urandom(32) # clé AES-256 générée aléatoirement
encrypted_session_key = public_key.encrypt(
session_key,
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None),
)
# encrypted_session_key est envoyé au destinataire, seule sa clé privée peut le déchiffrer
# les données volumineuses sont ensuite chiffrées avec session_key en AES-GCM (voir leçon précédente)# Handshake TLS 1.3 simplifié
1. ClientHello : le client propose les suites cryptographiques supportées + son paramètre de clé éphémère
2. ServerHello : le serveur choisit la suite, envoie son certificat + sa clé éphémère
3. Le client vérifie le certificat (chaîne de confiance jusqu'à une autorité de certification racine)
4. Les deux parties dérivent une clé de session partagée (Diffie-Hellman éphémère -> forward secrecy)
5. Toute la suite de la communication est chiffrée avec cette clé de session (AES-GCM ou ChaCha20-Poly1305)
# TLS 1.3 vs 1.2 : handshake réduit à 1 aller-retour (0-RTT possible), suites faibles supprimées# Générer un certificat auto-signé pour un environnement de lab/dev (JAMAIS en production publique)
openssl req -x509 -newkey rsa:4096 -keyout lab-key.pem -out lab-cert.pem -days 365 -nodes -subj "/CN=lab.technologik.local"
# Inspecter un certificat existant (chaîne, validité, algorithme de signature)
openssl x509 -in lab-cert.pem -noout -text | head -30
# Tester la configuration TLS d'un serveur (suites supportées, versions de protocole)
nmap --script ssl-enum-ciphers -p 443 lab.technologik.local
openssl s_client -connect lab.technologik.local:443 -tls1_2# Configuration nginx durcie pour TLS (à adapter selon les recommandations Mozilla SSL Config Generator)
server {
listen 443 ssl http2;
server_name technologik.local;
ssl_certificate /etc/ssl/certs/technologik.crt;
ssl_certificate_key /etc/ssl/private/technologik.key;
ssl_protocols TLSv1.2 TLSv1.3; # désactive SSLv3, TLS 1.0/1.1 obsolètes
ssl_ciphers HIGH:!aNULL:!MD5:!3DES;
ssl_prefer_server_ciphers off; # TLS 1.3 gère mieux le choix côté client
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1h;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
}# Erreurs fréquentes en production
- Certificat expiré non renouvelé -> automatiser avec Let's Encrypt / certbot (renouvellement cron)
- Chaîne de certificats incomplète (certificat intermédiaire manquant) -> "SSL handshake failed" côté client
- Mixed content : page HTTPS chargeant des ressources HTTP -> navigateur bloque ou avertit
- Ne pas activer HSTS -> laisse une fenêtre pour le downgrade HTTP->HTTPS (SSL stripping)Résumé
- L'asymétrique résout la distribution de clé ; le chiffrement hybride combine asymétrique (échange) + symétrique (débit).
- Ed25519/ECC offrent une sécurité équivalente à RSA avec des clés bien plus courtes.
- TLS 1.3 simplifie le handshake et impose la forward secrecy.
- HSTS, suites modernes et renouvellement automatisé des certificats sont non négociables en production.
Exercices pratiques
Mission : l'audit TLS avant la certification PCI-DSS
Objectif : Diagnostiquer une configuration TLS incomplète (suites obsolètes, HSTS absent, chaîne de certificats cassée) et proposer les corrections précises.
Contexte
Un scanner externe mandaté avant une certification PCI-DSS remonte trois constats sur technologik-lab.local : le serveur accepte encore TLS_RSA_WITH_3DES_EDE_CBC_SHA en TLSv1.0, aucun header Strict-Transport-Security n'est renvoyé, et certains clients (hors navigateurs grand public) échouent avec SSL handshake failed alors que le certificat n'est pourtant pas expiré.