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 :
- SSL Labs — objectif : grade A+
- Security Headers — vérification des headers HTTP
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é.