Comprendre SSL/TLS, générer un certificat Let's Encrypt avec Certbot et configurer HTTPS sur Apache2 sous Debian.
Debian avec Apache2 installé. Un nom de domaine public pointant vers le serveur (pour Let's Encrypt). Port 80 et 443 ouverts dans le pare-feu.
SSL (Secure Sockets Layer) et son successeur TLS (Transport Layer Security) assurent le chiffrement des communications entre le navigateur et le serveur web. HTTPS = HTTP + TLS. Le cadenas vert dans le navigateur indique que la connexion est chiffrée.
| Étape TLS | Description |
|---|---|
| 1. ClientHello | Le client indique les versions TLS et algorithmes supportés |
| 2. ServerHello | Le serveur choisit la version et l'algorithme, envoie son certificat |
| 3. Vérification cert | Le client vérifie que le certificat est signé par une CA de confiance |
| 4. Échange de clé | Génération d'une clé de session symétrique (ex: via ECDH) |
| 5. Données chiffrées | Toutes les données HTTP sont chiffrées avec la clé de session |
| Type | Coût | Validité | Usage |
|---|---|---|---|
| Auto-signé | Gratuit | Illimitée | Lab, dev — avertissement navigateur |
| Let's Encrypt (DV) | Gratuit | 90 jours | Sites web publics — renouvellement automatique |
| Payant DV | 10-50€/an | 1-2 ans | Sites web — même niveau que Let's Encrypt |
| Payant OV | 50-200€/an | 1-2 ans | Entreprises — vérification organisation |
| Payant EV | 200€+/an | 1-2 ans | Banques, e-commerce — barre verte (obsolète) |
sudo a2enmod ssl
sudo systemctl reload apache2
# Générer clé privée + certificat auto-signé (365 jours)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/monsite.key \
-out /etc/ssl/certs/monsite.crt \
-subj "/C=FR/ST=Normandie/L=Avranches/O=NDLP/CN=monsite.local"
# Installer Certbot et le plugin Apache sudo apt install certbot python3-certbot-apache -y # Obtenir un certificat pour un domaine public sudo certbot --apache -d monsite.fr -d www.monsite.fr # Certbot va : # 1. Vérifier que le domaine pointe bien vers ce serveur (challenge HTTP) # 2. Générer le certificat # 3. Modifier automatiquement la config Apache pour HTTPS
# VirtualHost HTTPS (/etc/apache2/sites-available/monsite-ssl.conf) <VirtualHost *:443> ServerName www.monsite.fr DocumentRoot /var/www/monsite SSLEngine on SSLCertificateFile /etc/letsencrypt/live/monsite.fr/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/monsite.fr/privkey.pem # En-têtes de sécurité Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" Header always set X-Content-Type-Options "nosniff" Header always set X-Frame-Options "SAMEORIGIN" <Directory /var/www/monsite> Options -Indexes AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/monsite-ssl-error.log CustomLog ${APACHE_LOG_DIR}/monsite-ssl-access.log combined </VirtualHost> # Redirection HTTP vers HTTPS <VirtualHost *:80> ServerName www.monsite.fr Redirect permanent / https://www.monsite.fr/ </VirtualHost>
# Certbot installe automatiquement un timer systemd systemctl status certbot.timer # Tester le renouvellement (simulation) sudo certbot renew --dry-run # Renouveler manuellement si besoin sudo certbot renew # Voir les certificats installés sudo certbot certificates
# Tester la connexion SSL depuis le terminal openssl s_client -connect monsite.fr:443 # Voir la date d'expiration du certificat echo | openssl s_client -connect monsite.fr:443 2>/dev/null | \ openssl x509 -noout -dates
✅ Réponse : Les réponses A et C sont correctes
✅ Réponse : 90 jours
✅ Réponse : Strict-Transport-Security (HSTS)
✅ Réponse : certbot renew --dry-run
✅ Réponse : Un cert auto-signé n'est pas reconnu par les navigateurs — Let's Encrypt est signé par une CA de confiance