Un site sans HTTPS en 2026, c'est un cadenas barré dans le navigateur, un malus SEO et des visiteurs qui fuient. La bonne nouvelle : sur un VPS, obtenir un certificat SSL/TLS valide, reconnu par tous les navigateurs et 100 % gratuit prend moins de cinq minutes grâce à Certbot, le client officiel de Let's Encrypt. Dans ce guide, nous installons Certbot sur Debian/Ubuntu, générons un certificat pour Nginx et Apache, configurons le renouvellement automatique, et passons en revue les erreurs que nous rencontrons le plus souvent en support y compris celles qui ne figurent dans aucune documentation officielle.
Let's Encrypt et Certbot : comment ça marche
Let's Encrypt est une autorité de certification (CA) à but non lucratif qui délivre des certificats SSL/TLS gratuits via le protocole ACME. Certbot, développé par l'EFF, est le client ACME de référence : il dialogue avec Let's Encrypt, prouve que vous contrôlez bien votre domaine, récupère le certificat et configure votre serveur web le tout en une commande.
La preuve de contrôle passe par un « défi » (challenge). Le plus courant, HTTP-01, consiste à déposer un fichier temporaire accessible sur le port 80 de votre serveur : si Let's Encrypt parvient à le lire depuis l'extérieur, le domaine est validé et le certificat émis. C'est pour cela qu'un VPS avec une IP publique dédiée est l'environnement idéal vous contrôlez le serveur web, les ports et le DNS de bout en bout.

Particularité à connaître : les certificats Let's Encrypt ne durent que 90 jours, contre un an pour les certificats commerciaux. Ce n'est pas une limitation, c'est un choix de sécurité assumé : une clé compromise a une durée d'exploitation courte, et la rotation force l'automatisation. Avec le renouvellement automatique de Certbot, vous n'y penserez plus jamais.
Prérequis
Avant de lancer la moindre commande, vérifiez ces quatre points 90 % des échecs d'émission viennent de là :
- Un VPS Linux sous Debian 12/13 ou Ubuntu 22.04/24.04 avec un accès root (ou sudo).
- Un nom de domaine dont l'enregistrement DNS
A(etAAAAsi vous utilisez l'IPv6) pointe vers l'IP publique du VPS et dont la propagation est terminée. - Un serveur web installé et qui répond déjà en HTTP. Si ce n'est pas fait, suivez d'abord notre guide installer Nginx et PHP-FPM sur un VPS.
- Les ports 80 et 443 ouverts dans votre pare-feu. Sous UFW :
sudo ufw allow 'Nginx Full'(ou'WWW Full'pour Apache).
Vous êtes sur un hébergement web mutualisé ? Ce guide concerne les serveurs VPS. Sur un hébergement cPanel, le SSL se gère en quelques clics : voyez comment créer un certificat SSL sur cPanel.
Étape 1 : installer Certbot
La méthode recommandée par l'EFF est l'installation via snap, qui garantit une version toujours à jour (le paquet apt de Debian/Ubuntu accuse parfois plusieurs versions de retard, ce qui pose problème lors des évolutions du protocole ACME) :
sudo apt update && sudo apt install snapd -y
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Vérifiez l'installation : certbot --version doit répondre certbot 5.x. Si vous préférez rester sur les dépôts officiels, sudo apt install certbot python3-certbot-nginx (ou python3-certbot-apache) fonctionne aussi assumez simplement une version plus ancienne.
Étape 2 : obtenir et installer le certificat
Avec Nginx
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
Le plugin --nginx fait tout : validation du domaine, émission du certificat, modification du bloc server de votre configuration, et mise en place de la redirection HTTP → HTTPS (répondez « 2 » quand Certbot vous le propose ou ajoutez --redirect à la commande pour ne pas avoir la question).

Avec Apache
sudo certbot --apache -d your-domain.com -d www.your-domain.com
Sans serveur web (mode standalone)
Pour un serveur mail, un panel, ou toute application qui gère elle-même le TLS, Certbot peut monter son propre serveur web temporaire sur le port 80 :
sudo systemctl stop nginx # libérer le port 80 si besoin
sudo certbot certonly --standalone -d your-domain.com
sudo systemctl start nginx
Dans tous les cas, vos fichiers se trouvent dans /etc/letsencrypt/live/your-domain.com/ : fullchain.pem (certificat + chaîne intermédiaire c'est presque toujours celui-là qu'attendent vos applications) et privkey.pem (clé privée, à ne jamais exposer).
Étape 3 : vérifier le renouvellement automatique
C'est l'étape que tout le monde saute et la cause n°1 des sites qui affichent « certificat expiré » trois mois plus tard. L'installation snap crée un timer systemd qui exécute certbot renew deux fois par jour ; chaque certificat est renouvelé dès qu'il entre dans sa fenêtre des 30 derniers jours de validité.

Vérifiez que le timer est actif, puis simulez un renouvellement complet sans consommer votre quota :
systemctl list-timers | grep certbot
sudo certbot renew --dry-run
Si le dry-run se termine par Congratulations, all simulated renewals succeeded, vous pouvez oublier votre certificat pour toujours. Astuce d'admin : si un service doit être rechargé après renouvellement (Nginx recharge tout seul via le plugin, mais pas un serveur mail par exemple), utilisez un deploy hook :
sudo certbot renew --deploy-hook "systemctl reload postfix"
Aller plus loin : certificat wildcard (*.your-domain.com)
Un certificat wildcard couvre tous les sous-domaines d'un coup pratique quand vous hébergez app., api. et blog. sur le même VPS. Let's Encrypt l'autorise, mais uniquement via le défi DNS-01 : au lieu d'un fichier sur le port 80, vous prouvez le contrôle du domaine en créant un enregistrement TXT _acme-challenge :
sudo certbot certonly --manual --preferred-challenges dns \
-d "your-domain.com" -d "*.your-domain.com"
Le mode --manual exige de recréer le TXT à chaque renouvellement : en production, utilisez plutôt un plugin DNS (certbot-dns-cloudflare, certbot-dns-ovh…) qui automatise la création de l'enregistrement via l'API de votre zone DNS.
Les 5 erreurs les plus fréquentes (et leurs solutions)
1. « Connection refused » ou « Timeout during connect » le port 80 est fermé ou filtré. Vérifiez sudo ufw status et n'oubliez pas qu'HTTP-01 exige le port 80 ouvert même si votre site ne servira que du HTTPS.
2. « DNS problem: NXDOMAIN » l'enregistrement A n'existe pas encore ou n'a pas fini de se propager. Testez avec dig +short your-domain.com : tant que l'IP du VPS ne s'affiche pas, inutile de relancer Certbot.
3. Le piège de l'enregistrement AAAA un classique que nous voyons souvent en support : Let's Encrypt privilégie l'IPv6 quand un enregistrement AAAA existe. Si celui-ci pointe vers une IP où votre serveur web n'écoute pas, la validation échoue alors que le site fonctionne en IPv4. Corrigez le AAAA ou configurez Nginx pour écouter en [::]:80.
4. « too many certificates already issued » vous avez atteint le rate limit de Let's Encrypt (50 certificats par domaine et par semaine, et surtout 5 doublons exacts par semaine). C'est fréquent quand on relance la commande en boucle pour « tester ». Utilisez toujours --dry-run pour vos essais : le serveur de staging n'a pas ces limites.
5. Le renouvellement échoue alors que l'émission a marché typiquement, vous avez changé la config Nginx entre-temps (suppression du bloc server, port 80 redirigé ailleurs, pare-feu resserré). Le --dry-run après chaque grosse modification de configuration vous évitera la mauvaise surprise 60 jours plus tard.
Bonnes pratiques pour un HTTPS solide
Le certificat n'est que la moitié du travail. Pour une configuration TLS digne de ce nom : forcez la redirection 301 de HTTP vers HTTPS (Certbot le propose), activez HSTS (add_header Strict-Transport-Security "max-age=31536000" always; dans Nginx) pour que les navigateurs n'essaient plus jamais le HTTP, et contrôlez votre note sur SSL Labs visez A ou A+. Les paramètres TLS générés par Certbot (options-ssl-nginx.conf) suivent les recommandations Mozilla et donnent déjà un A dans la plupart des cas.
Enfin, HTTPS ne protège que le transport : pensez aussi à sécuriser l'accès SSH, le pare-feu et vos applications. Nos guides sécuriser phpMyAdmin avec Nginx et déployer Laravel sur un VPS montrent comment intégrer proprement le SSL dans une stack complète, et l'ensemble de nos tutoriels est disponible dans la documentation Linux.
FAQ – Certbot et Let's Encrypt
Certbot est-il vraiment gratuit ? Oui, totalement. Let's Encrypt est financé par des dons et sponsors (EFF, Mozilla…). Aucune limite de nombre de domaines, aucun coût caché.
Un certificat Let's Encrypt est-il aussi « sûr » qu'un certificat payant ? Le chiffrement est strictement identique (même TLS, mêmes algorithmes). Les certificats payants se distinguent uniquement par la validation d'organisation (OV/EV) et l'assurance contractuelle pas par la sécurité technique.
Pourquoi seulement 90 jours de validité ? Choix de sécurité délibéré : limiter la durée d'exploitation d'une clé compromise et forcer l'automatisation du renouvellement. Avec le timer de Certbot, c'est transparent.
Puis-je utiliser Certbot sur un VPS Windows ? Certbot est conçu pour Linux. Sous Windows Server (IIS), utilisez un client ACME comme win-acme, ou placez le TLS sur un reverse proxy Linux en frontal.
Combien de temps prend l'installation complète ? Sur un VPS propre avec le DNS déjà propagé : moins de 5 minutes, installation de Certbot comprise.
Conclusion
Avec Certbot, le HTTPS n'est plus un poste de dépense ni une corvée trimestrielle : une commande pour émettre, un timer pour renouveler, et un --dry-run pour dormir tranquille. La seule vraie condition, c'est de partir d'une base saine un serveur avec IP dédiée, un accès root et des ports que vous contrôlez.
Si vous n'avez pas encore votre serveur, nos VPS Linux NVMe sont livrés en moins de 60 secondes avec Debian ou Ubuntu préinstallé, une IP dédiée et la protection anti-DDoS incluse tout ce qu'il faut pour dérouler ce guide de A à Z.
