🔒Ajout d'un sous-domaine sur le reverse proxy Nginx génération Let's Encrypt
Cette procédure décrit l'ajout d'un nouveau sous-domaine sur le reverse proxy Nginx, avec :
- création de la configuration Nginx dans
/etc/nginx/conf.d/; - redirection HTTP vers HTTPS ;
- certificat Let's Encrypt ;
- authentification HTTP Basic via
.htpasswd; - accès sans authentification depuis le LAN ;
- proxy vers un serveur interne ;
- prise en charge des WebSockets ;
- tests DNS, Nginx, TLS et backend.
1. Architecture
Le principe est le suivant :
Internet
│
│ https://SOUS-DOMAINE.numericare.fr
â–Ľ
Routeur / équipement amont
│
│ PROXY protocol
â–Ľ
Reverse Proxy Nginx
│
│ HTTPS / HTTP
â–Ľ
Serveur interne
10.151.151.xxx:PORT
Dans cette infrastructure, les configurations Nginx sont stockées directement dans :
/etc/nginx/conf.d/
Un fichier est créé par sous-domaine.
Exemple :
/etc/nginx/conf.d/browser.numericare.fr.conf
2. Informations nécessaires avant de commencer
Déterminer les éléments suivants :
| Élément | Exemple |
|---|---|
| Sous-domaine | browser.numericare.fr |
| Serveur backend | 10.151.151.229 |
| Port backend | 3001 |
| Protocole backend | HTTPS |
| Fichier Nginx | /etc/nginx/conf.d/browser.numericare.fr.conf |
| Authentification | /etc/nginx/.htpasswd |
Avant de commencer, confirmer également que le serveur backend est accessible depuis le reverse proxy.
3. Vérifier le DNS
Créer ou modifier l'enregistrement DNS du sous-domaine.
Le sous-domaine doit pointer vers l'adresse IP publique qui arrive sur le reverse proxy.
Exemple :
browser.numericare.fr → IP publique du reverse proxy
Ne pas faire pointer directement le DNS vers l'adresse privée du backend :
❌ browser.numericare.fr → 10.151.151.229
Depuis le reverse proxy, vérifier la résolution :
dig +short browser.numericare.fr
ou :
nslookup browser.numericare.fr
Le résultat doit correspondre à l'adresse IP publique du reverse proxy.
4. Vérifier le backend
Depuis le reverse proxy, tester la connectivité vers le serveur interne.
Pour un backend HTTPS :
curl -vk https://10.151.151.229:3001/
Pour un backend HTTP :
curl -v http://10.151.151.229:3001/
Tester également le port :
nc -vz 10.151.151.229 3001
Le résultat attendu est similaire à :
Connection to 10.151.151.229 3001 port [tcp/*] succeeded!
Si le backend n'est pas accessible, ne pas poursuivre la configuration du reverse proxy.
5. Vérifier le répertoire Let's Encrypt
Le répertoire utilisé pour les challenges ACME doit exister :
sudo ls -ld /var/www/certbot
S'il n'existe pas :
sudo mkdir -p /var/www/certbot
sudo chown -R www-data:www-data /var/www/certbot
6. Créer le fichier Nginx
Créer le fichier correspondant au sous-domaine :
sudo nano /etc/nginx/conf.d/SOUS-DOMAINE.numericare.fr.conf
Exemple pour browser.numericare.fr :
sudo nano /etc/nginx/conf.d/browser.numericare.fr.conf
7. Configuration HTTP / HTTPS
Utiliser la structure suivante :
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name SOUS-DOMAINE.numericare.fr;
# Let's Encrypt ACME HTTP-01
location ^~ /.well-known/acme-challenge/ {
root /var/www/certbot;
try_files $uri =404;
}
# Tout le reste → HTTPS
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl proxy_protocol;
server_name SOUS-DOMAINE.numericare.fr;
# ============================================================
# SSL
# ============================================================
ssl_certificate /etc/letsencrypt/live/SOUS-DOMAINE.numericare.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/SOUS-DOMAINE.numericare.fr/privkey.pem;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
keepalive_timeout 70;
# ============================================================
# REAL IP
# ============================================================
real_ip_header proxy_protocol;
set_real_ip_from 10.151.151.230;
set_real_ip_from 10.151.151.228;
set_real_ip_from 10.151.151.102;
# ============================================================
# AUTHENTIFICATION
# ============================================================
satisfy any;
# Pas de mot de passe depuis le LAN
allow 10.151.151.0/24;
# Authentification obligatoire depuis l'extérieur
deny all;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
# ============================================================
# PROXY
# ============================================================
location / {
proxy_pass https://10.151.151.xxx:PORT;
proxy_buffering off;
proxy_set_header Host $http_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;
# WebSockets
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_http_version 1.1;
}
}
Important : si plusieurs fichiers Nginx utilisent le bloc :
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
le map ne doit être déclaré qu'une seule fois dans toute la configuration Nginx.
Vérifier avant d'en ajouter un nouveau :
sudo grep -R "map \$http_upgrade" /etc/nginx/
Si le map existe déjà , ne pas le recopier dans le nouveau fichier.
8. Ne pas recharger Nginx immédiatement
Si le certificat n'existe pas encore, la configuration HTTPS référence des fichiers inexistants :
/etc/letsencrypt/live/SOUS-DOMAINE.numericare.fr/fullchain.pem
/etc/letsencrypt/live/SOUS-DOMAINE.numericare.fr/privkey.pem
Il est donc préférable de générer le certificat avant le premier reload de cette nouvelle configuration.
9. Générer le certificat Let's Encrypt
Utiliser Certbot avec le webroot :
sudo certbot certonly \
--webroot \
-w /var/www/certbot \
-d SOUS-DOMAINE.numericare.fr
Exemple :
sudo certbot certonly \
--webroot \
-w /var/www/certbot \
-d browser.numericare.fr
Certbot doit terminer avec un message indiquant que le certificat a été obtenu.
10. Vérifier le certificat
sudo ls -l /etc/letsencrypt/live/SOUS-DOMAINE.numericare.fr/
Les fichiers suivants doivent notamment exister :
cert.pem
chain.pem
fullchain.pem
privkey.pem
11. Tester la configuration Nginx
Avant tout reload :
sudo nginx -t
Le résultat attendu :
syntax is ok
test is successful
En cas d'erreur, ne pas recharger Nginx.
12. Recharger Nginx
Si le test est correct :
sudo systemctl reload nginx
Vérifier que Nginx fonctionne toujours :
sudo systemctl status nginx --no-pager
Le service doit ĂŞtre :
Active: active (running)
13. Tester le HTTPS
Depuis le reverse proxy :
curl -vk https://SOUS-DOMAINE.numericare.fr/
Exemple :
curl -vk https://browser.numericare.fr/
La connexion TLS doit être établie et le certificat doit correspondre au sous-domaine.
14. Vérifier le certificat avec OpenSSL
openssl s_client \
-connect SOUS-DOMAINE.numericare.fr:443 \
-servername SOUS-DOMAINE.numericare.fr
Vérifier que le certificat présenté correspond au sous-domaine.
15. Tester l'accès depuis le LAN
Depuis une machine située dans le réseau 10.151.151.0/24, ouvrir :
https://SOUS-DOMAINE.numericare.fr
Grâce à :
satisfy any;
allow 10.151.151.0/24;
deny all;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
l'accès depuis le LAN doit être autorisé sans demande de mot de passe.
16. Tester l'accès depuis Internet
Utiliser un réseau extérieur au LAN, par exemple une connexion mobile 4G/5G.
Ouvrir :
https://SOUS-DOMAINE.numericare.fr
Les identifiants sont ceux présents dans :
/etc/nginx/.htpasswd
17. Tester les WebSockets
Si l'application utilise les WebSockets, vérifier son fonctionnement directement dans l'application.
La configuration suivante doit être présente :
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_http_version 1.1;
Elle permet notamment aux applications interactives utilisant WebSocket de fonctionner correctement derrière Nginx.
18. Vérifier les logs
En cas de problème :
sudo tail -f /var/log/nginx/access.log
Dans un autre terminal :
sudo tail -f /var/log/nginx/error.log
Puis refaire une connexion au sous-domaine.
19. Diagnostic rapide
| Symptôme | Vérification |
|---|---|
| DNS incorrect | dig +short SOUS-DOMAINE.numericare.fr |
| Backend inaccessible | nc -vz IP PORT |
| Backend HTTPS | curl -vk https://IP:PORT/ |
| Erreur Nginx | sudo nginx -t |
| Erreur TLS | openssl s_client ... |
| Erreur proxy | sudo tail -f /var/log/nginx/error.log |
| Erreur HTTP Basic | Vérifier /etc/nginx/.htpasswd |
| WebSocket | Vérifier Upgrade et Connection |
20. Vérification finale
Exécuter :
echo "=== DNS ==="
dig +short SOUS-DOMAINE.numericare.fr
echo "=== NGINX ==="
sudo nginx -t
echo "=== CERTIFICAT ==="
sudo ls -l /etc/letsencrypt/live/SOUS-DOMAINE.numericare.fr/
echo "=== SERVICE NGINX ==="
sudo systemctl is-active nginx
echo "=== BACKEND ==="
nc -vz IP_BACKEND PORT_BACKEND
echo "=== HTTPS ==="
curl -Ik https://SOUS-DOMAINE.numericare.fr/
Le nouveau sous-domaine est considéré comme opérationnel lorsque :
- le DNS pointe vers l'IP publique du reverse proxy ;
- le backend est accessible depuis Nginx ;
- le certificat Let's Encrypt est valide ;
nginx -test OK ;- Nginx est actif ;
- le HTTPS fonctionn