LibraHostDocumentation

Documentation

Guides complets pour tous nos services d'hébergement

🔒 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 :

  1. Renseignez votre email (notifications d'expiration)
  2. Acceptez les conditions d'utilisation
  3. Choisissez si vous voulez recevoir des newsletters (optionnel)
  4. 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#

  1. SSL Labs : https://www.ssllabs.com/ssltest/
  2. Security Headers : https://securityheaders.com/
  3. 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