đAjout d'un sous-domaine sur le reverse proxy Nginx gĂ©nĂ©ration Let's Encrypt
Cette procédure permetdécrit del'ajout générer un certificat TLS Let's Encrypt pour d'un nouveau nom de sous-domaine hébergé derriÚresur le serveurreverse Nginxproxy deNginx, la plateforme.
Elle est utilisée lorsqu'un nouveau service HTTP(S) est publié.
đŻ Objectif
à la fin de cette procédureavec :
LecrĂ©ationVirtualdeHostla configuration Nginxexiste.dans/etc/nginx/conf.d/ ;LeredirectionchallengeHTTPACMEversestHTTPSaccessible.;Lecertificat Let's Encryptest gĂ©nĂ©rĂ©.;LeauthentificationcertificatHTTPpourraBasicensuiteviaĂȘtre.htpasswdutilisĂ©;
đ1. PrĂ©requisArchitecture
Le nomprincipe 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 :
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 existe.
Le sous-domaine pointedoit 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 Web.
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 TCP:
nc -vz 10.151.151.229 3001
Le résultat attendu est accessiblesimilaire depuisà Internet.
Connection to 10.151.151.229 3001 port [tcp/*] succeeded!
Si le backend n'est installé.
la configuration du reverse proxy.
đ5. ĂtapeVĂ©rifier 1le 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 Virtualfichier HostNginx
Créer un nouveaule fichier decorrespondant configuration.au sous-domaine :
cdsudo nano /etc/nginx/conf.d
nano pdf.d/SOUS-DOMAINE.numericare.fr.conf
Exemple pour browser.numericare.fr :
sudo nano /etc/nginx/conf.d/browser.numericare.fr.conf
đ7. ĂtapeConfiguration 2HTTP -/ AjouterHTTPS
Utiliser la configurationstructure minimalesuivante :
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name pdf.SOUS-DOMAINE.numericare.fr;
# Let's Encrypt ACME HTTP-01
location ^~ /.well-known/acme-challenge/ {
root /var/www/certbot;
allowtry_files all;$uri =404;
}
# Tout le reste â HTTPS
location / {
return 404;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. ĂtapeNe 3pas 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 est :
syntax is ok
test is successful
En cas d'erreur, ne pas recharger Nginx.
đ Ătape 4 -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. ĂtapeTester 5le HTTPS
Depuis le reverse proxy :
curl -vk Générerhttps://SOUS-DOMAINE.numericare.fr/
Exemple :
curl -vk https://browser.numericare.fr/
La connexion TLS doit ĂȘtre Ă©tablie et le certificat
certbotdoit certonlycorrespondre --webrootau -w /var/www/certbot -d pdf.numericare.frsous-domaine.
â
Ătape 6 -14. VĂ©rifier le certificat avec OpenSSL
certbotopenssl certificatess_client \
-connect SOUS-DOMAINE.numericare.fr:443 \
-servername SOUS-DOMAINE.numericare.fr
Vérifier notammentque 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 :
đ Emplacement des certificats
https:/etc/letsencrypt/live/<domain>/
Les fichiers principaux sont :
đ VĂ©rifications
Tester la résolution DNS
dig pdf.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 HTTPdepuis Internet
Utiliser un réseau extérieur au LAN, par exemple une connexion mobile 4G/5G.
Ouvrir :
curl http:https://pdf.SOUS-DOMAINE.numericare.fr
Tester
Les identifiants sont ceux présents dans :
curl http://pdf.numericare.fr/etc/nginx/.well-known/acme-challenge/testhtpasswd
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. DĂ©pannageVĂ©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
| Vérification | |
|---|---|
dig |
nc -vz IP PORT
Backend HTTPS
curl -vk https://IP:PORT/
Erreur sudo lenginx répertoire /var/www/certbot-t.
Erreur openssl less_client droits sur le répertoire ACME....
sudo quetail le-f port/var/log/nginx/error.log
/etc/nginx/.htpasswd
WebSocket
Vérifier Upgrade et Connection
20.
đĄVĂ©rification Bonnesfinale
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 :
ToujoursletesterDNSlapointeconfigurationversavecl'IPnginxpublique-t.du reverse proxy ;Nelejamaisbackendrechargerest accessible depuis Nginxsans validation préalable.;Conserver une configuration minimale pendant la génération du certificat.
đ Ăvolution de la plateforme
Cette procédure est actuellement réalisée manuellement. L'objectif à long terme est de l'automatiser entiÚrement via AWX et Ansible. à terme, la création d'un nouveau Virtual Host et l'obtention du certificat Let's Encrypt ferontest partievalide du;
processus
nginx de-t ```