🔒 Installer SSL Let's Encrypt avec Certbot + Nginx#
Sécurisez vos sites web avec des certificats SSL gratuits Let's Encrypt grâce à Certbot. Ce guide vous accompagne pour passer en HTTPS et configurer le renouvellement automatique.
🎯 Objectifs#
- 🔐 Installer des certificats SSL gratuits Let's Encrypt
- ⚡ Configurer Certbot pour Nginx
- 🔄 Mettre en place le renouvellement automatique
- 🛡️ Optimiser la configuration SSL pour la sécurité
- ✅ Tester et valider l'installation HTTPS
🧰 Prérequis#
- Nginx + PHP-FPM installé (voir guide Nginx + PHP-FPM)
- Nom de domaine valide pointant vers votre VPS
- Port 80 et 443 ouverts sur votre serveur
- Accès root ou sudo
💡 Important : Ce guide s'appuie sur l'installation Nginx du tutoriel précédent. Assurez-vous d'avoir d'abord configuré Nginx correctement.
1️⃣ Préparation et vérifications#
🌐 Vérification du domaine#
Avant de commencer, vérifiez que votre domaine pointe bien vers votre serveur :
# Vérification DNS nslookup votre-domaine.com dig votre-domaine.com # Test d'accès HTTP (doit fonctionner) curl -I http://votre-domaine.com
🔧 Vérification Nginx#
# Vérification de la configuration Nginx sudo nginx -t # Statut du service sudo systemctl status nginx # Test des ports sudo netstat -tlnp | grep -E ':80|:443'
2️⃣ Installation de Certbot#
📦 Installation via APT (Ubuntu/Debian)#
# Installation de Certbot et du plugin Nginx sudo apt update sudo apt install certbot python3-certbot-nginx -y
✅ Vérification de l'installation#
# Test de Certbot certbot --version # Aide et options disponibles certbot --help
3️⃣ Obtention du certificat SSL#
🎫 Première installation avec configuration automatique#
Certbot peut automatiquement modifier votre configuration Nginx :
# Installation automatique pour un domaine sudo certbot --nginx -d votre-domaine.com -d www.votre-domaine.com # Installation pour plusieurs domaines sudo certbot --nginx -d site1.com -d www.site1.com -d site2.com -d www.site2.com
Pendant l'installation :
- Renseignez votre email (notifications d'expiration)
- Acceptez les conditions d'utilisation
- Choisissez si vous voulez recevoir des newsletters (optionnel)
- Certbot configurera automatiquement Nginx et créera la redirection HTTPS
🔧 Installation manuelle#
Si vous préférez contrôler la configuration :
# Obtention du certificat seulement (sans modification auto) sudo certbot certonly --nginx -d votre-domaine.com -d www.votre-domaine.com
4️⃣ Configuration manuelle Nginx (si installation manuelle)#
Si vous avez choisi l'installation manuelle, modifiez votre configuration Nginx :
📝 Configuration SSL complète#
# Modification de votre site sudo nano /etc/nginx/sites-available/monsite
Configuration complète avec SSL :
# Redirection HTTP vers HTTPS server { listen 80; listen [::]:80; server_name votre-domaine.com www.votre-domaine.com; # Redirection permanente vers HTTPS return 301 https://$server_name$request_uri; } # Configuration HTTPS server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name votre-domaine.com www.votre-domaine.com; # Certificats SSL ssl_certificate /etc/letsencrypt/live/votre-domaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/votre-domaine.com/privkey.pem; # Configuration SSL sécurisée ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # Sécurité HTTPS add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; # Configuration du site (identique à la version HTTP) root /var/www/html/monsite; index index.php index.html index.htm; # Logs access_log /var/log/nginx/monsite_ssl_access.log; error_log /var/log/nginx/monsite_ssl_error.log; # Configuration PHP location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # Sécurité location ~ /\.ht { deny all; } # Optimisation cache location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf|zip)$ { expires 1y; add_header Cache-Control "public, immutable"; } # Gestion URLs location / { try_files $uri $uri/ /index.php?$query_string; } }
✅ Application de la configuration#
# Test de la configuration sudo nginx -t # Rechargement de Nginx sudo systemctl reload nginx
5️⃣ Configuration SSL optimisée#
🔐 Création d'un fichier de configuration SSL réutilisable#
# Création d'un fichier de configuration SSL sudo nano /etc/nginx/snippets/ssl-params.conf
Configuration SSL optimisée :
# Protocoles SSL ssl_protocols TLSv1.2 TLSv1.3; # Ciphers sécurisés ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA; ssl_prefer_server_ciphers off; # Cache des sessions SSL ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets off; # OCSP Stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # Headers de sécurité add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "no-referrer-when-downgrade" always;
🔄 Utilisation du fichier SSL dans vos sites#
Modifiez vos configurations de sites pour utiliser ce fichier :
server { listen 443 ssl http2; server_name votre-domaine.com; # Certificats ssl_certificate /etc/letsencrypt/live/votre-domaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/votre-domaine.com/privkey.pem; # Inclusion de la configuration SSL include /etc/nginx/snippets/ssl-params.conf; # ... reste de la configuration }
6️⃣ Renouvellement automatique#
🔄 Configuration du renouvellement#
Let's Encrypt génère des certificats valides 90 jours. Le renouvellement automatique est essentiel :
# Test du renouvellement (dry-run) sudo certbot renew --dry-run # Vérification des certificats installés sudo certbot certificates
⏰ Configuration du cron pour le renouvellement#
# Édition du crontab root sudo crontab -e
Ajoutez la ligne suivante :
# Renouvellement automatique Let's Encrypt (2 fois par jour) 0 */12 * * * root certbot -q renew --nginx
7️⃣ Tests et validation#
🧪 Tests de base#
# Test HTTPS local curl -I https://votre-domaine.com # Vérification des certificats openssl s_client -connect votre-domaine.com:443 -servername votre-domaine.com
🌐 Tests en ligne#
- SSL Labs : https://www.ssllabs.com/ssltest/
- Security Headers : https://securityheaders.com/
- Certificate Transparency : https://crt.sh/
📊 Vérification des scores#
Un bon setup doit obtenir :
- Grade A ou A+ sur SSL Labs
- Grade A sur Security Headers
- Vert sur tous les tests de compatibilité
8️⃣ Gestion de plusieurs domaines#
🌍 Ajout d'un nouveau domaine#
# Ajout d'un certificat pour un nouveau site sudo certbot --nginx -d nouveau-site.com -d www.nouveau-site.com # Ou extension d'un certificat existant sudo certbot --nginx --expand -d ancien-site.com -d www.ancien-site.com -d nouveau-site.com
🔧 Gestion des sous-domaines#
# Certificat wildcard (nécessite validation DNS) sudo certbot certonly --manual --preferred-challenges dns -d "*.votre-domaine.com" -d votre-domaine.com
9️⃣ Dépannage#
🔍 Problèmes courants#
Erreur : "Challenge failed"
# Vérification que le domaine est accessible curl -I http://votre-domaine.com/.well-known/acme-challenge/test # Vérification de la configuration Nginx sudo nginx -t
Erreur : "Certificate already exists"
# Forcer le renouvellement sudo certbot renew --force-renewal # Ou suppression et nouvelle installation sudo certbot delete --cert-name votre-domaine.com sudo certbot --nginx -d votre-domaine.com
Erreur : "Port 80 not accessible"
# Vérification du firewall sudo ufw status sudo iptables -L # Vérification des ports sudo netstat -tlnp | grep :80
📋 Logs utiles#
# Logs Certbot sudo tail -f /var/log/letsencrypt/letsencrypt.log # Logs Nginx sudo tail -f /var/log/nginx/error.log # Test de configuration détaillé sudo certbot renew --dry-run --verbose
✅ Résumé de l'installation#
Votre installation SSL Let's Encrypt est maintenant complète avec :
- 🔒 Certificats SSL gratuits et valides
- ⚡ Configuration HTTPS optimisée
- 🔄 Renouvellement automatique configuré
- 🛡️ Sécurité renforcée avec headers appropriés