Comment HTTPS et TLS fonctionnent réellement : handshake et certificats
Pourquoi HTTPS est important (et pourquoi c'est mal compris)
Vous avez probablement vu l'icône de cadenas dans votre navigateur et supposé que le site est « sécurisé ». Mais qu'est-ce que cela signifie vraiment ? HTTPS ne concerne pas seulement le chiffrement ; il s'agit d'identité, d'intégrité et de confiance. Beaucoup de développeurs traitent TLS comme une boîte noire—configurez-le une fois et oubliez-le. Cela conduit à des mauvaises configurations, des certificats expirés et des suites de chiffrement vulnérables.
Dans cet article, nous allons décomposer comment HTTPS et TLS fonctionnent réellement, du handshake à la validation des certificats, et vous montrer comment le configurer correctement. Pas de blabla, juste des connaissances pratiques que vous pouvez appliquer dès aujourd'hui.
Le handshake TLS : ce qui se passe avant le premier octet
Lorsqu'un client (navigateur) se connecte à un serveur via HTTPS, ils effectuent un handshake TLS. Cela établit un canal sécurisé. Voici une version simplifiée (TLS 1.3) :
- Client Hello : Le client envoie les suites de chiffrement prises en charge, une valeur aléatoire et une part de clé (pour l'échange de clés).
- Server Hello : Le serveur choisit une suite de chiffrement, envoie sa propre valeur aléatoire et sa part de clé, et présente sa chaîne de certificats.
- Authentification : Le client vérifie le certificat du serveur auprès des AC de confiance et vérifie le nom d'hôte.
- Dérivation de clé : Les deux parties calculent le secret partagé en utilisant ECDHE (Elliptic Curve Diffie-Hellman Ephemeral).
- Finished : Les deux envoient des messages « Finished » chiffrés pour confirmer le handshake.
Après cela, les données applicatives sont chiffrées avec des clés symétriques. TLS 1.3 réduit les allers-retours à un seul, améliorant la latence.
Échange de clés : ECDHE vs RSA
Les anciennes versions de TLS utilisaient l'échange de clés RSA, qui manque de confidentialité persistante. Si la clé privée du serveur est compromise, le trafic passé peut être déchiffré. Les configurations modernes utilisent ECDHE, qui offre une confidentialité persistante—chaque session a des clés uniques.
# Exemple : Vérifier les algorithmes d'échange de clés pris en charge
openssl s_client -connect example.com:443 -cipher 'ECDHE'
Certificats : les ancres de confiance
Un certificat lie une clé publique à une identité (nom de domaine). Il est signé par une autorité de certification (AC) à laquelle le client fait confiance. Les navigateurs sont livrés avec un magasin d'AC racines de confiance.
Lorsque vous visitez un site, le serveur envoie une chaîne : certificat feuille (pour votre domaine) → AC intermédiaire → AC racine. Le client vérifie chaque signature jusqu'à une racine de confiance.
Types de certificats
- Validation de domaine (DV) : Prouve seulement le contrôle du domaine. Rapide et gratuit (par exemple, Let's Encrypt).
- Validation d'organisation (OV) : Inclut des détails d'organisation vérifiés.
- Validation étendue (EV) : Vérification plus stricte ; les navigateurs n'affichent plus de barre verte, mais certaines entreprises les utilisent encore.
Étapes de validation des certificats
Les navigateurs vérifient :
- La chaîne de signatures mène à une racine de confiance.
- Le certificat est dans sa période de validité.
- Le nom d'hôte correspond (Subject Alternative Names).
- Le certificat n'est pas révoqué (via OCSP ou CRL).
Si une vérification échoue, vous obtenez un avertissement. Ne contournez jamais ces avertissements en production.
Configuration de HTTPS sur votre serveur
Regardons une configuration Nginx typique pour HTTPS avec des paramètres TLS modernes.
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
# HSTS (à utiliser avec prudence)
add_header Strict-Transport-Security "max-age=63072000" always;
}
Remarques :
- Utilisez uniquement TLS 1.2 et 1.3 ; désactivez les versions antérieures.
- Préférez les chiffrements ECDHE pour la confidentialité persistante.
- Activez HTTP/2 pour la performance.
- HSTS force les navigateurs à utiliser HTTPS ; ne l'activez qu'après des tests.
Obtention de certificats avec Let's Encrypt
Let's Encrypt fournit des certificats DV gratuits. Utilisez Certbot pour automatiser l'émission et le renouvellement :
sudo certbot --nginx -d example.com -d www.example.com
Certbot modifie votre configuration Nginx et met en place une tâche cron pour le renouvellement. Testez toujours le renouvellement avec --dry-run.
Pièges courants et comment les éviter
- Certificats expirés : Mettez en place une surveillance et un renouvellement automatique.
- Chaîne incomplète : Incluez les certificats intermédiaires (fullchain.pem).
- Chiffrements faibles : Désactivez RC4, DES et les chiffrements d'exportation.
- Contenu mixte : Assurez-vous que toutes les ressources (images, scripts) se chargent via HTTPS.
- Pas de HSTS : Sans HSTS, les utilisateurs peuvent être rétrogradés vers HTTP.
Tester votre configuration HTTPS
Utilisez des outils en ligne comme SSL Labs ou des outils en ligne de commande pour vérifier votre configuration.
# Vérifier les détails du certificat
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -text
# Tester la prise en charge de TLS 1.3
openssl s_client -connect example.com:443 -tls1_3
Recherchez :
- Une chaîne de certificats valide.
- Aucun protocole faible (SSLv3, TLS 1.0, TLS 1.1).
- Confidentialité persistante activée.
- En-tête HSTS présent.
FAQ
Quelle est la différence entre TLS et SSL ?
SSL est le prédécesseur de TLS. TLS 1.0 était essentiellement SSL 3.1. Aujourd'hui, « SSL » est souvent utilisé familièrement, mais vous devriez toujours utiliser TLS 1.2 ou 1.3.
Ai-je besoin d'un certificat payant pour HTTPS ?
Non. Les certificats DV gratuits de Let's Encrypt sont approuvés par tous les principaux navigateurs et offrent le même chiffrement que les payants. Les certificats payants offrent des garanties et un support, mais le chiffrement est identique.
Comment HTTPS affecte-t-il les performances ?
TLS ajoute de la latence en raison du handshake, mais TLS 1.3 le réduit à un seul aller-retour. Avec la reprise de session et HTTP/2, la surcharge est minimale. Les coûts de chiffrement/déchiffrement sont faibles sur les CPU modernes.
Prêt à inspecter la configuration TLS de votre serveur ? Utilisez notre Analyseur de logs Nginx pour repérer les modèles de trafic inhabituels et vous assurer que votre configuration HTTPS fonctionne comme prévu.