Module B05

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.

VersionStatutRaison
SSL 2.0 / SSL 3.0⛔ MortPOODLE, 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.

TypeValidationDélaiUsage
DV (Domain Validated)Contrôle DNS/HTTP du domaineMinutesSites web, API — Let's Encrypt
OV (Organization Validated)Vérifie l'organisationJoursSites d'entreprise
EV (Extended Validation)Vérification approfondie de l'entitéSemainesBanques, 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 CA

03 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.

⚠️ Le header upgrade-insecure-requests dans CSP force le navigateur à upgrader les requêtes HTTP vers HTTPS mais ne remplace pas HSTS.
✓ Pile complète recommandée : TLS 1.3 + HSTS preload + OCSP stapling + certificat Let's Encrypt renouvelé auto.