Comment fonctionnent vraiment HTTPS et TLS : guide pratique
Vous avez probablement vu l'icône du cadenas dans votre navigateur et savez qu'elle signifie « sécurisé ». Mais que se passe-t-il réellement lorsqu'un utilisateur tape https:// devant votre domaine ? Si vous êtes développeur, comprendre la mécanique de HTTPS et TLS n'est pas seulement académique : cela vous aide à déboguer les problèmes de connexion, à choisir le bon certificat et à éviter des erreurs de sécurité subtiles.
Ce guide explique en termes simples la poignée de main TLS, la validation des certificats et le chiffrement, avec des exemples pratiques que vous pouvez appliquer à vos propres projets.
Ce qu'est vraiment HTTPS
HTTPS est simplement HTTP superposé à TLS (Transport Layer Security). TLS offre trois garanties :
- Chiffrement : Les données échangées entre le client et le serveur sont illisibles pour les oreilles indiscrètes.
- Authentification : Le serveur prouve son identité à l'aide d'un certificat signé par une autorité de confiance.
- Intégrité : Les messages ne peuvent pas être modifiés en transit sans être détectés.
Sans TLS, HTTP envoie tout en texte clair : les mots de passe, les cookies et les données personnelles sont visibles par quiconque sur le chemin du réseau.
La poignée de main TLS en langage simple
Avant l'envoi de toute donnée HTTP, le client et le serveur effectuent une poignée de main pour s'accorder sur les paramètres de chiffrement. TLS 1.3 (la norme moderne) simplifie cela en un seul aller-retour.
Étape par étape : poignée de main TLS 1.3
- Client Hello : Le client envoie une liste des suites de chiffrement prises en charge, des versions TLS et un échange de clé (une clé publique pour l'échange de clés).
- Server Hello : Le serveur choisit une suite de chiffrement, envoie son propre échange de clé et fournit sa chaîne de certificats.
- Dérivation de clé : Les deux parties calculent indépendamment le même secret partagé à l'aide de l'échange de clés Diffie-Hellman. Ce secret n'est jamais envoyé sur le réseau.
- Finished : Le client et le serveur échangent des messages « Finished » chiffrés pour confirmer la réussite de la poignée de main.
Après ces étapes, les données applicatives (requêtes et réponses HTTP) sont chiffrées avec des clés symétriques dérivées du secret partagé.
Voici une illustration simplifiée du déroulement de la poignée de main :
Client Server
| |
|-------- ClientHello (key share) ---->|
| |
|<------- ServerHello (key share, -----|
| certificate, Finished) |
| |
|-------- Finished ------------------->|
| |
|<====== Encrypted HTTP Data =========>|
En TLS 1.2, la poignée de main nécessite deux allers-retours et inclut une étape distincte d'échange de clés. TLS 1.3 réduit la latence et supprime les algorithmes plus faibles.
Comment les certificats établissent la confiance
Un certificat TLS lie une clé publique à un nom de domaine et est signé par une autorité de certification (CA). Lorsque votre navigateur se connecte à un serveur, il vérifie :
- Chaîne de signatures : Le certificat doit remonter à une AC racine de confiance dans le magasin de confiance du navigateur.
- Correspondance du domaine : Le nom alternatif du sujet (SAN) du certificat doit inclure le nom d'hôte demandé.
- Période de validité : Le certificat ne doit pas être expiré ou pas encore valide.
- Statut de révocation : Le navigateur peut vérifier OCSP ou CRL pour s'assurer que le certificat n'a pas été révoqué.
Si l'une des vérifications échoue, le navigateur affiche un avertissement. Let's Encrypt a popularisé les certificats gratuits et automatisés, rendant HTTPS accessible à tous.
Types de certificats en un coup d'œil
| Type | Niveau de validation | Cas d'utilisation typique |
|---|---|---|
| Validation de domaine (DV) | Contrôle du domaine uniquement | Sites personnels, blogs, API |
| Validation d'organisation (OV) | Domaine + identité de l'organisation | Sites web d'entreprise |
| Validation étendue (EV) | Vérification stricte de l'identité | Institutions financières, sites à haute confiance |
Pour la plupart des développeurs, un certificat DV de Let's Encrypt est suffisant et peut être renouvelé automatiquement avec des outils comme Certbot.
Chiffrement : symétrique et asymétrique
TLS utilise les deux types de chiffrement :
- Cryptographie asymétrique (à clé publique) : Utilisée pendant la poignée de main pour authentifier le serveur et échanger en toute sécurité un secret partagé. Les algorithmes incluent RSA et ECDHE.
- Chiffrement symétrique : Utilisé pour le chiffrement en masse des données après la poignée de main. Les algorithmes incluent AES-GCM et ChaCha20-Poly1305.
Le chiffrement symétrique est beaucoup plus rapide, c'est pourquoi il est utilisé pour le transfert réel des données. Le rôle de la poignée de main est d'établir cette clé symétrique de manière sécurisée.
Pièges courants et comment les éviter
1. Contenu mixte
Si votre page HTTPS charge des ressources (images, scripts, styles) via HTTP, les navigateurs peuvent les bloquer ou afficher des avertissements. Utilisez toujours des URL relatives ou explicitement HTTPS.
2. Suites de chiffrement faibles
Désactivez les protocoles obsolètes (TLS 1.0, TLS 1.1) et les chiffrements faibles (RC4, 3DES). Les serveurs modernes ne doivent prendre en charge que TLS 1.2 et 1.3 avec des suites de chiffrement à secret direct.
3. Expiration du certificat
Les certificats expirés provoquent des erreurs immédiates dans le navigateur. Automatisez le renouvellement avec Let's Encrypt et mettez en place une surveillance pour vous alerter avant l'expiration.
4. Configuration incorrecte de la chaîne
Les serveurs doivent envoyer la chaîne de certificats complète (sauf la racine). L'absence de certificats intermédiaires provoque des échecs sur certains clients. Utilisez des outils comme SSL Labs pour tester votre chaîne.
5. Mauvaise configuration HSTS
HTTP Strict Transport Security (HSTS) force les navigateurs à utiliser HTTPS, mais une fois défini, il est difficile de revenir en arrière. Commencez par un max-age court et augmentez-le progressivement.
Débogage des problèmes TLS
Lorsque HTTPS échoue, ces commandes aident à diagnostiquer le problème :
# Vérifier les détails du certificat et la chaîne
openssl s_client -connect example.com:443 -servername example.com
# Tester les versions TLS et les chiffrements
nmap --script ssl-enum-ciphers -p 443 example.com
# Vérifier l'expiration du certificat
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
Des outils en ligne comme SSL Labs fournissent une note complète et des retours sur la configuration.
FAQ
Quelle est la différence entre TLS et SSL ?
SSL (Secure Sockets Layer) est le prédécesseur obsolète de TLS. Les systèmes modernes utilisent TLS 1.2 ou 1.3 ; « SSL » est souvent utilisé familièrement, mais les protocoles ne sont pas identiques.
HTTPS ralentit-il mon site web ?
TLS moderne ajoute une latence minimale, souvent quelques millisecondes seulement avec TLS 1.3 et la reprise de session. Les avantages en matière de sécurité l'emportent largement sur ce faible surcoût.
À quelle fréquence dois-je renouveler mon certificat TLS ?
La plupart des certificats sont valides 90 jours (Let's Encrypt) ou jusqu'à un an. Automatisez le renouvellement et mettez en place une surveillance pour éviter une expiration inattendue.
Prêt à inspecter vos propres certificats ? Utilisez l'Analyseur de logs Nginx pour repérer les erreurs de poignée de main TLS et surveiller les modèles de trafic HTTPS dans les logs de votre serveur.