Skip to main content

🔒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Ă©ation Virtualde Hostla configuration Nginx existe.dans /etc/nginx/conf.d/ ;
  • Leredirection challengeHTTP ACMEvers estHTTPS accessible.;
  • Le certificat Let's Encrypt est gĂ©nĂ©rĂ©.;
  • Leauthentification certificatHTTP pourraBasic ensuitevia ĂȘtre.htpasswd utilisĂ©;
dansaccĂšs lasans configurationauthentification HTTPS.depuis le LAN ; proxy vers un serveur interne ; prise en charge des WebSockets ; tests DNS, Nginx, TLS et backend.

📋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 :

    É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 existe.

    du sous-domaine.

    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.

    interne. Le

    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:

    80
    nc -vz 10.151.151.229 3001
    

    Le résultat attendu est accessiblesimilaire depuisà Internet.

    : Certbot
    Connection to 10.151.151.229 3001 port [tcp/*] succeeded!
    

    Si le backend n'est installé.

    pas Nginxaccessible, fonctionnene correctement.pas poursuivre
    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.fr

    sous-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 :

      Le domaine. La date d'expiration. Le chemin des certificats.

      📂 Emplacement des certificats

      https:/etc/letsencrypt/live/<domain>/
      

      Les fichiers principaux sont :

        fullchain.pem privkey.pem cert.pem chain.pem

        🔍 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

        Le lenavigateur challengedoit ACMEdemander les identifiants HTTP Basic.

        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

        ProblÚmeSymptÎme Vérification
        ÉchecDNS du challenge ACMEincorrect VĂ©rifierdig la+short rĂ©solutionSOUS-DOMAINE.numericare.fr
        DNS etleBackend Virtualinaccessible Host.nc -vz IP PORT Backend HTTPS curl -vk https://IP:PORT/ Erreur 404Nginx ContrĂŽlersudo lenginx rĂ©pertoire /var/www/certbot-t. Erreur de permissionsTLS VĂ©rifieropenssl less_client droits sur le rĂ©pertoire ACME.... ÉchecErreur de validationproxy ContrĂŽlersudo quetail le-f port/var/log/nginx/error.log 80 estbienErreur publiĂ©HTTP versBasic Nginx.VĂ©rifier /etc/nginx/.htpasswd WebSocket VĂ©rifier Upgrade et Connection

        20.

        💡VĂ©rification Bonnesfinale

        pratiques

        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 :

        • Toujoursle testerDNS lapointe configurationvers avecl'IP nginxpublique -t.du reverse proxy ;
        • Nele jamaisbackend rechargerest accessible depuis Nginx sans validation prĂ©alable.;
        • Conserver une configuration minimale pendant la gĂ©nĂ©ration du certificat.
        Mettre ensuite à jour le Virtual Host avec la configuration HTTPS définitive.

        🚀 É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 déploiementest deOK la; plateforme.Nginx

        ```

        est actif ; le HTTPS fonctionn