Security
Difficulte: Beginner
6 min de lecture

Let's Encrypt : Certificats SSL gratuits avec Certbot

Apprenez à sécuriser vos sites web avec des certificats SSL/TLS gratuits grâce à Let's Encrypt et Certbot. Du certificat simple au wildcard, en passant par le renouvellement automatique.

Retour aux tutoriels
À propos de Let's Encrypt
Let's Encrypt est une autorité de certification gratuite, automatisée et ouverte qui permet à quiconque d'obtenir des certificats SSL/TLS pour sécuriser ses sites web en HTTPS. Associé à Certbot, l'outil officiel de l'EFF, le processus d'obtention et de renouvellement des certificats est entièrement automatisé.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Un serveur Linux : Ubuntu 20.04+, Debian 11+ ou CentOS/RHEL 8+ avec un accès root ou sudo
  • Un nom de domaine : pointe vers l'adresse IP de votre serveur via un enregistrement DNS de type A (ou AAAA pour IPv6)
  • Un serveur web installe : Nginx ou Apache (sauf en mode standalone)
  • Les ports 80 et 443 ouverts : dans votre firewall (iptables, ufw, ou pare-feu cloud)
Vérification DNS
Vérifiez que votre domaine pointe bien vers votre serveur avant de lancer Certbot. Utilisez la commande dig +short votredomaine.com ou nslookup votredomaine.com pour confirmer la résolution.
# Vérifier la resolution DNS de votre domaine
dig +short votredomaine.com

# Vérifier que les ports 80 et 443 sont ouverts
sudo ufw status
# Ou avec iptables
sudo iptables -L -n | grep -E '80|443'

Fonctionnement de Let's Encrypt

Let's Encrypt utilise le protocole ACME (Automatic Certificate Management Environment) pour valider que vous contrôlez bien le domaine pour lequel vous demandez un certificat. Le processus se déroule en plusieurs étapes :

  1. Demande : Certbot envoie une requête à l'autorité Let's Encrypt pour le domaine souhaité
  2. Challenge : Let's Encrypt propose un défi de validation (HTTP-01, DNS-01 ou TLS-ALPN-01)
  3. Validation : Certbot répond au défi en plaçant un fichier sur le serveur web ou un enregistrement DNS
  4. Émission : Une fois le défi validé, Let's Encrypt émet le certificat

Les certificats émis ont une durée de validité de 90 jours. Cette courte durée est une décision de sécurité délibérée qui encourage l'automatisation et limite l'impact d'une compromission de clé privée.

Types de challenges

  • HTTP-01 : Le plus courant. Certbot place un fichier dans .well-known/acme-challenge/ sur le port 80
  • DNS-01 : Un enregistrement TXT est créé dans la zone DNS. Obligatoire pour les certificats wildcard
  • TLS-ALPN-01 : Validation via le port 443 avec une extension TLS spéciale. Rarement utilisé

Installation de Certbot

Certbot est l'outil officiel recommandé par Let's Encrypt. Plusieurs méthodes d'installation sont disponibles.

Méthode recommandée : Snap

Snap garantit toujours la dernière version de Certbot, indépendamment de la version de votre distribution :

# Installer snapd si absent
sudo apt update
sudo apt install -y snapd

# Installer Certbot via snap
sudo snap install --classic certbot

# Creer un lien symbolique pour l'acces global
sudo ln -s /snap/bin/certbot /usr/bin/certbot

# Vérifier l'installation
certbot --version

Méthode alternative : APT (Debian/Ubuntu)

# Installation via les depots système
sudo apt update
sudo apt install -y certbot

# Pour le plugin Nginx
sudo apt install -y python3-certbot-nginx

# Pour le plugin Apache
sudo apt install -y python3-certbot-apache

Méthode alternative : pip

# Installation via pip dans un environnement virtuel
sudo apt install -y python3 python3-venv
sudo python3 -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install certbot certbot-nginx
sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot
Conseil
La méthode Snap est recommandée car elle gère automatiquement les mises à jour de Certbot. Si vous utilisez APT, pensez à mettre à jour Certbot régulièrement.

Obtention d'un certificat avec Nginx

Le plugin Nginx de Certbot est capable de configurer automatiquement votre serveur web pour utiliser le certificat obtenu.

Configuration préalable de Nginx

Assurez-vous que votre bloc serveur Nginx contient la directive server_name avec votre domaine :

server {
    listen 80;
    server_name votredomaine.com www.votredomaine.com;

    root /var/www/votredomaine.com/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

Lancement de Certbot avec le plugin Nginx

# Obtenir et installer automatiquement le certificat
sudo certbot --nginx -d votredomaine.com -d www.votredomaine.com

# Mode non-interactif (ideal pour les scripts)
sudo certbot --nginx --non-interactive --agree-tos 
    --email admin@votredomaine.com 
    -d votredomaine.com -d www.votredomaine.com

Certbot va automatiquement :

  • Obtenir le certificat auprès de Let's Encrypt
  • Modifier la configuration Nginx pour activer SSL
  • Configurer la redirection HTTP vers HTTPS
  • Recharger Nginx pour appliquer les changements
Vérification
Après l'installation, testez votre certificat en accédant à https://votredomaine.com dans un navigateur. Vous pouvez également vérifier la note SSL sur SSL Labs.

Obtention d'un certificat avec Apache

Le plugin Apache fonctionne de manière similaire au plugin Nginx. Il détecte automatiquement vos VirtualHosts et configure SSL.

# Installer le plugin Apache si nécessaire
sudo apt install -y python3-certbot-apache

# Obtenir et installer le certificat
sudo certbot --apache -d votredomaine.com -d www.votredomaine.com

# Mode non-interactif
sudo certbot --apache --non-interactive --agree-tos 
    --email admin@votredomaine.com 
    -d votredomaine.com -d www.votredomaine.com

Certbot configure automatiquement le VirtualHost SSL, active le module mod_ssl et crée la redirection HTTP vers HTTPS.

Mode standalone

Le mode standalone est utile lorsque vous n'avez pas de serveur web installe ou que vous souhaitez obtenir un certificat sans modifier la configuration d'un serveur existant. Certbot lance son propre serveur web temporaire sur le port 80.

# Arreter le serveur web s'il utilise le port 80
sudo systemctl stop nginx  # ou apache2

# Obtenir le certificat en mode standalone
sudo certbot certonly --standalone -d votredomaine.com -d www.votredomaine.com

# Redémarrer le serveur web
sudo systemctl start nginx  # ou apache2
Port 80 requis
Le mode standalone nécessite que le port 80 soit libre. Arrêtez tout service utilisant ce port avant de lancer Certbot. Utilisez sudo ss -tlnp | grep :80 pour vérifier.

Mode DNS challenge

Le challenge DNS est la seule méthode permettant d'obtenir des certificats wildcard (*.domaine.com). Il est également utile lorsque le port 80 n'est pas accessible depuis Internet.

Challenge DNS manuel

# Demander un certificat wildcard avec challenge DNS manuel
sudo certbot certonly --manual --preferred-challenges dns 
    -d votredomaine.com -d "*.votredomaine.com"

Certbot vous demandera de créer un enregistrement TXT _acme-challenge.votredomaine.com dans votre zone DNS. Vous devrez le faire manuellement via l'interface de votre registrar ou fournisseur DNS.

Challenge DNS automatisé avec plugin

Pour automatiser le renouvellement des certificats wildcard, utilisez un plugin DNS. Voici l'exemple avec Cloudflare :

# Installer le plugin Cloudflare
sudo snap set certbot trust-plugin-with-root=ok
sudo snap install certbot-dns-cloudflare

# Creer le fichier de credentials
sudo mkdir -p /etc/letsencrypt
sudo tee /etc/letsencrypt/cloudflare.ini > /dev/null << 'EOF'
dns_cloudflare_api_token = VOTRE_TOKEN_API_CLOUDFLARE
EOF
sudo chmod 600 /etc/letsencrypt/cloudflare.ini

# Obtenir le certificat wildcard automatiquement
sudo certbot certonly --dns-cloudflare 
    --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini 
    -d votredomaine.com -d "*.votredomaine.com"
Plugins DNS disponibles
Certbot propose des plugins pour de nombreux fournisseurs DNS : Cloudflare, Route53 (AWS), Google Cloud DNS, DigitalOcean, OVH, Linode et bien d'autres. Consultez la documentation Certbot pour la liste complète.

Renouvellement automatique

Les certificats Let's Encrypt expirent après 90 jours. Il est essentiel de configurer un renouvellement automatique pour éviter toute interruption de service.

Tester le renouvellement

# Simuler un renouvellement pour vérifier la configuration
sudo certbot renew --dry-run

Timer systemd (méthode recommandée)

Si vous avez installé Certbot via Snap, un timer systemd est déjà configuré automatiquement :

# Vérifier que le timer est actif
sudo systemctl status snap.certbot.renew.timer

# Voir les timers certbot
sudo systemctl list-timers | grep certbot

Tâche cron (méthode alternative)

Si le timer systemd n'est pas disponible, configurez une tâche cron :

# Editer le crontab root
sudo crontab -e

# Ajouter la ligne suivante (renouvellement 2 fois par jour)
0 0,12 * * * /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"

L'option --deploy-hook exécute une commande uniquement si le certificat a été effectivement renouvelé. Ici, Nginx est rechargé pour prendre en compte le nouveau certificat.

Configuration SSL optimale

Obtenir un certificat n'est que la première étape. Une configuration SSL robuste est essentielle pour protéger vos utilisateurs.

Configuration Nginx optimisée

server {
    listen 443 ssl http2;
    server_name votredomaine.com www.votredomaine.com;

    # Certificats Let's Encrypt
    ssl_certificate /etc/letsencrypt/live/votredomaine.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/votredomaine.com/privkey.pem;

    # Protocoles et cipher suites
    ssl_protocols TLSv1.2 TLSv1.3;
    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 - Force HTTPS pendant 1 an
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/votredomaine.com/chain.pem;
    resolver 1.1.1.1 8.8.8.8 valid=300s;
    resolver_timeout 5s;

    # Session SSL
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # En-tetes de sécurité supplementaires
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;

    root /var/www/votredomaine.com/html;
    index index.html;
}

# Redirection HTTP vers HTTPS
server {
    listen 80;
    server_name votredomaine.com www.votredomaine.com;
    return 301 https://$host$request_uri;
}
Note A+ sur SSL Labs
Cette configuration vous permettra d'obtenir une note A+ sur le test SSL Labs. Le HSTS avec preload et l'OCSP stapling sont les éléments clés pour atteindre cette note maximale.

Certificats wildcard

Un certificat wildcard sécurise un domaine et tous ses sous-domaines de premier niveau avec un seul certificat. Par exemple, *.votredomaine.com couvre api.votredomaine.com, blog.votredomaine.com, mail.votredomaine.com, etc.

# Certificat wildcard (requiert DNS challenge)
sudo certbot certonly --dns-cloudflare 
    --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini 
    -d votredomaine.com 
    -d "*.votredomaine.com"
Limitations des wildcards
Un certificat wildcard *.domaine.com ne couvre pas domaine.com lui-même (ajoutez-le explicitement avec -d domaine.com). Il ne couvre pas non plus les sous-domaines de niveau inférieur comme sub.api.domaine.com.

Certificats multi-domaines (SAN)

Un certificat SAN (Subject Alternative Name) permet de sécuriser plusieurs domaines différents avec un seul certificat. C'est utile lorsque vous hébergez plusieurs sites sur le même serveur.

# Certificat multi-domaines
sudo certbot --nginx 
    -d domaine1.com -d www.domaine1.com 
    -d domaine2.fr -d www.domaine2.fr 
    -d domaine3.org

# Ajouter un domaine a un certificat existant
sudo certbot --nginx --expand 
    -d domaine1.com -d www.domaine1.com 
    -d domaine2.fr -d www.domaine2.fr 
    -d nouveau-domaine.com

Let's Encrypt autorise jusqu'à 100 noms de domaine par certificat SAN. C'est une solution pratique pour consolider la gestion de vos certificats sur un serveur multi-sites.

Troubleshooting

Voici les problèmes les plus courants rencontrés avec Let's Encrypt et Certbot, ainsi que leurs solutions.

Rate limits atteintes

Let's Encrypt impose des limites strictes pour éviter les abus :

  • 50 certificats par domaine enregistré par semaine
  • 5 certificats dupliqués par semaine
  • 5 échecs de validation par compte, par hostname, par heure
# Utiliser l'environnement de staging pour les tests
sudo certbot --staging --nginx -d votredomaine.com

# Vérifier les rate limits de votre domaine
# Consultez https://crt.sh/?q=votredomaine.com

Erreurs de validation HTTP-01

# Vérifier que le port 80 est accessible depuis Internet
curl -I http://votredomaine.com/.well-known/acme-challenge/test

# Vérifier la configuration du firewall
sudo ufw status verbose

# Vérifier que le serveur web est en cours d'execution
sudo systemctl status nginx  # ou apache2

# Consulter les logs Certbot
sudo tail -f /var/log/letsencrypt/letsencrypt.log

Renouvellement échoué

# Diagnostiquer le probleme de renouvellement
sudo certbot renew --dry-run --verbose

# Vérifier les certificats et leurs dates d'expiration
sudo certbot certificates

# Forcer le renouvellement d'un certificat spécifique
sudo certbot renew --cert-name votredomaine.com --force-renewal

# Vérifier les logs du timer systemd
sudo journalctl -u snap.certbot.renew.timer --since "7 days ago"
sudo journalctl -u snap.certbot.renew.service --since "7 days ago"

Erreurs courantes et solutions

  • Connection refused sur le port 80 : Vérifiez votre firewall et assurez-vous qu'aucun service ne bloque le port
  • DNS problem: NXDOMAIN : Votre domaine ne pointe pas vers le serveur. Vérifiez vos enregistrements DNS
  • Too many certificates already issued : Attendez la fin de la fenêtre de rate limiting (1 semaine) ou utilisez --staging
  • Unauthorized 403 : Le fichier de challenge n'est pas accessible. Vérifiez la configuration de votre serveur web et les permissions du répertoire .well-known
Astuce debug
Testez toujours avec le flag --staging avant de demander un vrai certificat. L'environnement de staging n'a pas de rate limits restrictifs et vous permet de valider votre configuration sans risque.

Conclusion

Let's Encrypt et Certbot ont démocratisé l'accès aux certificats SSL/TLS en rendant le processus gratuit et automatisé. Vous disposez maintenant des connaissances pour :

  • Installer Certbot et obtenir des certificats pour Nginx ou Apache
  • Utiliser le mode standalone et les challenges DNS
  • Configurer des certificats wildcard et multi-domaines
  • Automatiser le renouvellement avec systemd ou cron
  • Optimiser votre configuration SSL pour une note A+ sur SSL Labs
  • Diagnostiquer et résoudre les problèmes courants

Le HTTPS n'est plus une option mais une nécessité pour tout site web. Avec Let's Encrypt, il n'y a plus aucune excuse pour ne pas sécuriser vos communications. Prenez le temps de configurer HSTS et l'OCSP stapling pour une sécurité optimale, et vérifiez régulièrement que le renouvellement automatique fonctionne correctement.

Morgann Riu

Écrit par

Morgann Riu

Expert en cybersécurité et administration Linux. Je partage mes connaissances à travers des tutoriels gratuits et des formations pour aider les administrateurs systèmes et développeurs à sécuriser leurs infrastructures.

Partager ce tutoriel

Cet article vous a plu ?

Commentaires

Checklist Sécurité Linux

30 points essentiels pour sécuriser un serveur Linux. Recevez aussi les nouveaux tutoriels par email.

Pas de spam. Désabonnement en 1 clic.