Skip to content

Gestion des certificats SSL avec Certbot + Nginx (Docker)

Cette documentation décrit toutes les étapes pour gérer les certificats SSL Let’s Encrypt avec Certbot et un reverse-proxy Nginx tournant dans Docker.

Architecture utilisée

  • reverse-proxy (nginx:alpine)
  • Ports exposés : 80 (HTTP), 443 (HTTPS)
  • Montages :

    • mon-serveur_certbot-etc:/etc/letsencrypt:ro
    • mon-serveur_certbot-www:/var/www/certbot:ro
  • certbot (certbot/certbot:latest)

  • Utilisé uniquement en conteneur éphémère pour générer/renouveler les certificats
  • Montages :
    • mon-serveur_certbot-etc:/etc/letsencrypt
    • mon-serveur_certbot-www:/var/www/certbot

Configuration Nginx

Bloc HTTP (redirection vers HTTPS avec exception pour ACME)

server {
    listen 80;
    server_name exemple.julickmellah.fr;

    # Autoriser Let's Encrypt ACME challenge
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    # Tout le reste redirigé en HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}
````

### Bloc HTTPS (reverse proxy vers le service en backend)

```nginx
server {
    listen 443 ssl;
    server_name exemple.julickmellah.fr;

    # Certificats générés par Certbot
    ssl_certificate     /etc/letsencrypt/live/exemple.julickmellah.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/exemple.julickmellah.fr/privkey.pem;

    # Proxy vers le service (ex : GitLab)
    location / {
        proxy_pass http://gitlab:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Ajouter un nouveau domaine

  1. Ajouter la configuration Nginx (HTTP + HTTPS) pour le nouveau domaine

    • Exemple : registry.julickmellah.fr
    • Recharger Nginx pour appliquer la configuration :

docker exec -it reverse-proxy nginx -s reload
3. Générer le certificat avec Certbot :

docker run --rm \
  -v mon-serveur_certbot-etc:/etc/letsencrypt \
  -v mon-serveur_certbot-www:/var/www/certbot \
  certbot/certbot certonly \
  --webroot -w /var/www/certbot \
  -d registry.julickmellah.fr \
  --email ton.email@domaine.tld --agree-tos --no-eff-email
4. Recharger Nginx pour prendre en compte le certificat :

docker exec -it reverse-proxy nginx -s reload

Renouveler tous les certificats existants

Dry-run (test sans consommer de quota)

docker run --rm \
  -v mon-serveur_certbot-etc:/etc/letsencrypt \
  -v mon-serveur_certbot-www:/var/www/certbot \
  certbot/certbot renew \
  --webroot -w /var/www/certbot --dry-run

Renouvellement réel

docker run --rm \
  -v mon-serveur_certbot-etc:/etc/letsencrypt \
  -v mon-serveur_certbot-www:/var/www/certbot \
  certbot/certbot renew \
  --webroot -w /var/www/certbot

Recharger Nginx ensuite

docker exec -it reverse-proxy nginx -s reload

Script d’automatisation (cron)

Créer un fichier renew-certs.sh sur le host :

#!/usr/bin/env bash
set -euo pipefail

# Renouveler tous les certificats
docker run --rm \
  -v mon-serveur_certbot-etc:/etc/letsencrypt \
  -v mon-serveur_certbot-www:/var/www/certbot \
  certbot/certbot renew --webroot -w /var/www/certbot

# Recharger Nginx pour appliquer les nouveaux certificats
docker exec reverse-proxy nginx -s reload

Rendre le script exécutable :

chmod +x /srv/docker/mon-serveur/renew-certs.sh

Programmer une tâche cron (exécution 1 fois par mois) :

0 3 1 * * /srv/docker/mon-serveur/renew-certs.sh >> /var/log/certbot-renew.log 2>&1

Résumé des commandes utiles

Générer un certificat pour un nouveau domaine

docker run --rm \
  -v mon-serveur_certbot-etc:/etc/letsencrypt \
  -v mon-serveur_certbot-www:/var/www/certbot \
  certbot/certbot certonly \
  --webroot -w /var/www/certbot \
  -d nouveau.domaine.fr \
  --email ton.email@domaine.tld --agree-tos --no-eff-email

Vérifier la présence des certificats

docker run --rm -v mon-serveur_certbot-etc:/etc/letsencrypt alpine ls -lah /etc/letsencrypt/live

Renouveler tous les certificats

docker run --rm \
  -v mon-serveur_certbot-etc:/etc/letsencrypt \
  -v mon-serveur_certbot-www:/var/www/certbot \
  certbot/certbot renew --webroot -w /var/www/certbot

Recharger Nginx

docker exec -it reverse-proxy nginx -s reload