Nginx reverse proxy & SSL Let's Encrypt — exposer ses services en HTTPS

Partager
Nginx reverse proxy & SSL Let's Encrypt — exposer ses services en HTTPS

Introduction

Un reverse proxy permet d'exposer plusieurs services Docker derrière un seul point d'entrée HTTP/HTTPS. Nginx joue ce rôle en redirigeant les requêtes vers le bon conteneur selon le nom de domaine. Let's Encrypt fournit des certificats SSL/TLS gratuits via Certbot. Cet article documente la configuration mise en place pour sécuriser plusieurs sous-domaines avec un score A+ sur SSL Labs.


1. Installation de Nginx et Certbot

apt install nginx certbot python3-certbot-nginx -y
systemctl enable nginx
systemctl start nginx

2. Structure des fichiers de configuration

/etc/nginx/
├── nginx.conf                  # configuration globale
├── snippets/
│   └── ssl_params.conf         # paramètres SSL mutualisés
└── sites-available/
    ├── tdebray.fr               # domaine principal
    ├── portainer.tdebray.fr
    ├── cloud.tdebray.fr
    └── blog.tdebray.fr

Activer un site

ln -s /etc/nginx/sites-available/<DOMAINE> /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

3. Fichier ssl_params.conf

Ce fichier centralise les paramètres SSL pour tous les virtualhosts.

# /etc/nginx/snippets/ssl_params.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

4. Configuration d'un virtualhost type

# /etc/nginx/sites-available/<SOUS_DOMAINE>.<DOMAINE>
server {
    listen 80;
    server_name <SOUS_DOMAINE>.<DOMAINE>;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name <SOUS_DOMAINE>.<DOMAINE>;

    ssl_certificate /etc/letsencrypt/live/<SOUS_DOMAINE>.<DOMAINE>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<SOUS_DOMAINE>.<DOMAINE>/privkey.pem;
    include snippets/ssl_params.conf;

    location / {
        proxy_pass http://127.0.0.1:<PORT_SERVICE>;
        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;
    }
}

5. Obtenir un certificat Let's Encrypt

certbot --nginx -d <SOUS_DOMAINE>.<DOMAINE>

Certbot modifie automatiquement le virtualhost pour intégrer les chemins de certificat.

Renouvellement automatique

Certbot installe automatiquement un timer systemd. Pour vérifier :

systemctl status certbot.timer
certbot renew --dry-run    # simuler un renouvellement

6. Vérification

nginx -t                   # tester la syntaxe
systemctl reload nginx     # recharger sans coupure
curl -I https://<DOMAINE>  # vérifier les headers

Pour auditer le score SSL :


Référence rapide

Action Commande
Tester la config Nginx nginx -t
Recharger Nginx systemctl reload nginx
Lister les certificats certbot certificates
Renouveler les certificats certbot renew
Simuler un renouvellement certbot renew --dry-run
Logs Nginx tail -f /var/log/nginx/error.log

Conclusion

Avec cette configuration, chaque service Docker dispose de son propre sous-domaine sécurisé en HTTPS, avec redirection automatique depuis HTTP. Les paramètres SSL mutualisés dans ssl_params.conf garantissent un niveau de sécurité homogène sur tous les virtualhosts. Le renouvellement des certificats est entièrement automatisé.