HTTPS & TLS
TLS 1.3, certificats X.509, Let's Encrypt, cipher suites et configuration sécurisée.
01 TLS vs SSL — historique
SSL (Secure Sockets Layer) est l'ancêtre de TLS. SSL 2.0 (1995) et SSL 3.0 (1996) sont obsolètes et criblés de failles. TLS 1.0 et 1.1 sont également dépréciés depuis 2020. TLS 1.3 est le standard actuel.
| Version | Statut | Raison |
|---|---|---|
| SSL 2.0 / SSL 3.0 | ⛔ Mort | POODLE, DROWN — ne jamais utiliser |
| TLS 1.0 / 1.1 | ⛔ Déprécié | BEAST, CRIME, RC4 faible — désactivés par les navigateurs |
| TLS 1.2 | ⚠️ Toléré | Sécurisé si bien configuré (cipher suites strictes) |
| TLS 1.3 | ✅ Recommandé | Handshake plus rapide (1-RTT), forward secrecy obligatoire, ciphers modernes |
Améliorations TLS 1.3
TLS 1.3 supprime les algorithmes faibles (RSA key exchange, RC4, DES, 3DES, MD5, SHA-1), rend la Forward Secrecy obligatoire (ECDHE), réduit la latence de handshake à 1-RTT (contre 2-RTT en TLS 1.2), et supporte le 0-RTT pour les sessions reprises.
02 Certificats X.509 — chaîne de confiance
Un certificat TLS prouve l'identité d'un serveur. Il est signé par une Autorité de Certification (CA) reconnue par les navigateurs.
| Type | Validation | Délai | Usage |
|---|---|---|---|
| DV (Domain Validated) | Contrôle DNS/HTTP du domaine | Minutes | Sites web, API — Let's Encrypt |
| OV (Organization Validated) | Vérifie l'organisation | Jours | Sites d'entreprise |
| EV (Extended Validation) | Vérification approfondie de l'entité | Semaines | Banques, e-commerce |
Chaîne de certificats
Root CA (dans les navigateurs — auto-signé)
└─ Intermediate CA (signé par Root CA)
└─ Votre certificat (signé par Intermediate CA)
├─ Clé publique du serveur
├─ Nom de domaine (CN / SAN)
├─ Date d'expiration
└─ Signature de l'Intermediate CA03 Let's Encrypt — certbot
Let's Encrypt est une CA gratuite, automatisée et ouverte. Ses certificats sont valables 90 jours et renouvelables automatiquement.
# Installer certbot (Ubuntu) sudo apt install certbot python3-certbot-nginx # Obtenir un certificat (Nginx) sudo certbot --nginx -d example.com -d www.example.com # Renouvellement automatique (cron) 0 12 * * * certbot renew --quiet # Vérifier le renouvellement certbot renew --dry-run
Node.js avec HTTPS natif
const https = require('https'); const fs = require('fs'); const options = { key: fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem'), cert: fs.readFileSync('/etc/letsencrypt/live/example.com/fullchain.pem'), minVersion: 'TLSv1.2', }; https.createServer(options, app).listen(443); // Redirection HTTP → HTTPS http.createServer((req, res) => { res.writeHead(301, { Location: `https://${req.headers.host}${req.url}` }); res.end(); }).listen(80);
04 Configuration TLS sécurisée
# Configuration Nginx optimale (TLS 1.3 + 1.2) server { listen 443 ssl http2; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # TLS versions ssl_protocols TLSv1.2 TLSv1.3; # Cipher suites modernes (TLS 1.2) 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 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"; # OCSP Stapling ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; }
OCSP Stapling
OCSP (Online Certificate Status Protocol) vérifie si un certificat est révoqué. Le stapling permet au serveur de pré-vérifier son propre certificat et d'inclure la réponse OCSP dans la poignée de main TLS — évitant une requête supplémentaire du navigateur.
05 Mixed content & redirections
Mixed Content
Une page HTTPS qui charge des ressources HTTP crée du "mixed content". Les navigateurs bloquent les mixed content actifs (scripts, styles) et affichent des avertissements pour le passif (images).
<!-- ❌ Mixed content actif — bloqué par navigateurs --> <script src="http://example.com/script.js"></script> <!-- ✅ Ressources relatives ou HTTPS --> <script src="/script.js"></script> <script src="https://cdn.example.com/script.js"></script>
Downgrade Attack — HTTP Strict Transport Security
Sans HSTS, un attaquant MitM peut intercepter la première requête HTTP et maintenir une connexion non chiffrée (SSL stripping). HSTS force le navigateur à ne jamais faire de requête HTTP vers le domaine.
upgrade-insecure-requests dans CSP force le navigateur à upgrader les requêtes HTTP vers HTTPS mais ne remplace pas HSTS.