NginX HTTPS Reverse Proxy

Ce guide décrit les étapes de configuration d’un reverse Proxy permettant du HTTPS en extérieur vers du HTTP en local.

1/ Installer Nginx

Installation NGINX
sudo yum install epel-release
sudo yum install nginx
sudo systemctl start nginx
sudo systemctl enable nginx
Ajout des règles Firewall (CentOS)
sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

2/ Configurer le reverse proxy HTTP

Voici une configuration simple en HTTP vers la machine locale 192.168.0.2

Nginx Reverse Proxy HTTP classique
server {
        listen 80;
        server_name     machine2.monsite.fr;
        location ~ /\. { deny all; access_log off; log_not_found off; }
        location / {
                proxy_pass      http://192.168.0.2;
        }
}

Ensuite pour générer le certificat SSL via Let’s Encrypt il faut autoriser l’accès au dossier .well-known :

Configuration Let's Encrypt
server {
        listen 80;
        server_name     machine2.monsite.fr;
        #Nécéssaire pour la génération du certificat SSL
        location ~ /\.well-known{
                root /var/www/html;
                allow all;
        }
        location ~ /\. { deny all; access_log off; log_not_found off; }
        location / {
                proxy_pass      http://192.168.0.2;
        }
}

3/ Générer le certificat SSL

Génération des certificats Let's Encrypt
/opt/letsencrypt/letsencrypt-auto certonly --rsa-key-size 4096 --webroot --webroot-path /var/www/html -d machine2.monsite.fr

Les certificats seront générés dans le dossier /etc/letsencrypt/live/[ALIAS.DOMAINE]

  • /etc/letsencrypt/live/machine2.monsite.fr/fullchain.pem;
  • /etc/letsencrypt/live/machine2.monsite.fr/privkey.pem;
  • /etc/letsencrypt/live/machine2.monsite.fr/fullchain.pem;

4/ Créer la clé  Diffie-Hellman

Cette clé d’échange renforce la sécurité et sera utilisée comme paramètre dans la configuration HTTPS de Nginx.

dhparam
openssl dhparam -out /etc/ssl/private/dh4096.pem 4096

5/ Configurer le reverse proxy HTTPS

Redirection 301 du HTTP sur HTTPS
server {
        listen 80;
        server_name     machine2.monsite.fr;
        #Nécéssaire pour la génération du certificat SSL
        location ~ /\.well-known{
                root /var/www/html;
                allow all;
        }
        location ~ /\. { deny all; access_log off; log_not_found off; }
        return              301 https://$host$request_uri;
        location / {
                proxy_pass      http://192.168.0.2;
        }
}
Configuration HTTPS
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name machine2.monsite.fr;
    ssl on;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_certificate /etc/letsencrypt/live/machine2.monsite.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/machine2.monsite.fr/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/machine2.monsite.fr/fullchain.pem;
    ssl_session_timeout 1d;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/ssl/private/dh4096.pem;

    location ~ /\.well-known{
     root /var/www/html;
     allow all;
    }

    location / {
      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 https;
      proxy_pass http://192.168.0.2;
      proxy_read_timeout 90;
    }
}

6/ Redémarrage

Redémarrage Nginx
sudo systemctl restart nginx.service

Voilà la configuration est terminée, il ne reste plus qu’à redémarrer Nginx (en supposant que la configuration web de votre machine destination est déjà faite)