Skip to content

Troubleshooting

ZosiscoIV edited this page Apr 12, 2025 · 1 revision

1. Bug report

Titre :

Echec de la validation du domaine par Certbot en raison de l'occupation du port 80 par un conteneur Docker Nginx

Description du bug

Lors de l'exécution de la commande suivante :

sudo certbot --nginx -d www.l2-7.ephec-ti.be

Le certificat ne peut être généré :

  • Résultat attendu : Certbot configure automatiquement Nginx et obtient un certificat Let's Encrypt pour le domaine.
  • Résultat obtenu : L'erreur suivante s'affiche :
Certbot failed to authenticate some domains (authenticator: nginx).
Type: connection
Detail: Timeout during connect (likely firewall problem)

Puis :

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

Système concerné

Infrastructure

  • VPS OVH public
  • Service Nginx tournant dans un conteneur Docker via Docker Compose

schéma infrastructure

Logiciels

  • Nginx (via image Docker officielle nginx:stable)
  • Certbot version 2.10.0 (installé sur la machine hôte Ubuntu)
  • Docker 24.0+

Configurations

  • Configuration Nginx dans docker-compose.yml
  • Volume /etc/letsencrypt non monté initialement dans le conteneur Docker

Reproduction

  1. Démarrer les conteneurs Docker (docker-compose up -d)
  2. Exécuter la commande sudo certbot --nginx -d www.l2-7.ephec-ti.be
  3. Observer l’erreur liée au port 80 et à l’échec de validation

Début d'analyse (GitHub Issue)

Symptôme : port 80 déjà occupé

  • Commande : ss -tuln
  • Résultat :
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
  • Conclusion : Un processus utilise déjà le port 80, ce qui empêche Certbot de démarrer un serveur temporaire sur ce port.

2. Analyse du problème

1. Port 80 occupé

  • Commande : ss -tuln
  • Contexte : exécutée depuis la machine hôte
  • Résultat :
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
  • Conclusion : un processus écoute déjà sur le port 80, probablement Nginx dans Docker.

2. Vérification des conteneurs actifs

  • Commande : docker ps
  • Résultat :
CONTAINER ID   NAMES           PORTS
...            tp6_web_1       0.0.0.0:80->80/tcp
  • Conclusion : Le service tp6_web_1 (Nginx) écoute sur le port 80. Certbot ne peut donc pas l’utiliser.

3. Échec de Certbot

  • Commande : sudo certbot --nginx -d www.l2-7.ephec-ti.be
  • Résultat :
Timeout during connect (likely firewall problem)
  • Conclusion : La validation du challenge HTTP échoue car Certbot n’arrive pas à se lier au port 80.

3. Explication du problème

Le bug est dû à l’occupation du port 80 par un service Docker (Nginx) au moment où Certbot tente de le réquisitionner pour la validation du challenge HTTP. Or, le mode --nginx de Certbot tente de modifier la configuration de Nginx pour répondre sur /.well-known/..., ce qui échoue ici car Certbot ne contrôle pas le Nginx tournant dans Docker.

Résultat : la validation échoue systématiquement.


4. Correction du bug

  1. Arrêter temporairement le service Nginx dans Docker :
docker stop tp6_web_1
  1. Générer le certificat en mode standalone (hors nginx) :
sudo certbot certonly --standalone -d www.l2-7.ephec-ti.be
  1. Redémarrer Nginx :
docker start tp6_web_1
  1. Monter les certificats dans Docker via docker-compose.yml :
volumes:
  - /etc/letsencrypt:/etc/letsencrypt:ro
  1. Configurer Nginx dans le container pour utiliser les certificats :
ssl_certificate /etc/letsencrypt/live/www.l2-7.ephec-ti.be/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.l2-7.ephec-ti.be/privkey.pem;

5. Validation

Procédure

  1. Accéder à https://www.l2-7.ephec-ti.be via navigateur → cadenas vert attendu
  2. Vérifier le certificat avec curl :
curl -v https://www.l2-7.ephec-ti.be
  1. Vérifier avec OpenSSL :
openssl s_client -connect www.l2-7.ephec-ti.be:443

Vérification

  • Résultats :
    • curl : code 200 avec certificat valide
    • openssl : certificat émis par Let's Encrypt et domaine correspondant
    • Navigateur : cadenas vert, aucune erreur de certificat

Clone this wiki locally