Outils pour utilisateurs

Outils du site


nginx_reverse_proxy_lets_encrypt

Utiliser Nginx en reverse proxy avec Let's Encrypt

Le SSL est de plus en plus utilisé par les services auto-hébergés. En général ce protocole est géré par le serveur web qui reçoit les requêtes directement. Par contre si vous avez mis en place un reverse proxy, la chaîne de chiffrement se fera entre le navigateur, et ce fameux reverse proxy.

Utilisant NginX, je l'ai donc configuré pour qu'il fonctionne correctement avec ce type de requête en lui laissant gérer les certificats. Ceux-ci pourront être auto-signés grâce à openssl, ou délivrés par une autorité de certification. L'arrivée de Let's Encrypt permet à chacun d'avoir son propre certificat délivré par une autorité reconnue par tous les navigateurs. Nous verrons comment gérer ce type de certificats avec un reverse proxy, ainsi que la mise en place d'un système de chiffrement digne de se nom. Il faut d'abord avoir mis en place NginX en tant que cache et reverse proxy comme décrit ce tuto Installation et configuration d’un reverse proxy avec NginX.

Installation des paquets

Commençons par installer openssl et letsencrypt dispos tous les 2 dans les paquets debian. Je pars du postula que nginx est déjà installé.

apt update
 
apt install openssl letsencrypt

Création du certificat

On arrête nginx.

service nginx stop

On crée le certificat.

letsencrypt-auto certonly -d votrenomde.domaine --rsa-key-size 4096

Si vous utilisez www.votrenomde.domaine , il sera nécessaire de refaire l'opération en précisant “ -d www.votrenomde.domaine dans la commande ci-dessus. Idem pour tout autre sous-domaine. Vous êtes obligés de créer un certificat pour chaque sous-domaine que vous utilisez.

Lorsque la création du certificat est terminée, le message suivant apparaîtra :

IMPORTANT NOTES:
 
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/votrenomde.domaine/fullchain.pem. Your cert will
expire on 2016-02-10. To obtain a new version of the certificate in
the future, simply run Let's Encrypt again.

Configuration de NginX

Avant de commencer, notez qu'il y a 2 possibilité pour établir la configuration. Soit vous le faite dans /etc/nginx/nginx.conf, soit dans un fichier dédié à votre domaine comme si c'était un virtualhost classique dans /etc/nginx/sites-enabled. Dans ce dernier cas, le nom du fichier peut prendre n'importe quelle forme et ne pas sforcément se terminer par .conf .

Configuration d'Nginx et mise en place d'un chiffrement fort avec Let's Encrypt

Pour cela, nous allons créer une clé en 4096 bits. Ceci peut prendre du temps en fonction de l'activité de votre machine. Soyez patient.

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

Cela étant fait, nous allons pouvoir modifier le fichier de configuration “default” d'NginX pour utiliser les clés et certificats créés précédemment. Nous allons aussi préciser quels sont les protocoles de chiffrement utilisés entre le navigateur et le serveur. Ceci afin d'avoir un chiffrement d'un niveau acceptable vis à vis des utilisateurs de vos services.

Vous ne pouvez pas avoir plusieurs configurations possibles pour le même domaine. Le fichier de configuration créé dans le chapitre traitant du certificat auto-signé devra être vidé de tout ce qui concerne le domaine en question.

Le fichier de configuration doit être mis en place de cette façon:

server {
   listen       443;
   server_name  votrenomde.domaine;
   ssl on;
   ssl_protocols TLSv1.2;
   ssl_certificate /etc/letsencrypt/live/votrenomde.domaineg/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/votrenomde.domaine/privkey.pem;
   ssl_dhparam /etc/ssl/private/dh4096.pem;
   ssl_ecdh_curve secp384r1;
   ssl_prefer_server_ciphers on;
   ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
   location / {
               proxy_pass https://192.168.0.60/;
           }
}

listen 443 indique à NginX d'écouter le port 443 pour les sessions https

server_name est tout simplement votre nom de domaine

ssl on indique que le chiffrement sera utilisé pour cette redirection

ssl_protocols permet d'indiquer les différents protocoles supportés

ssl_certificate indique l'emplacement du fichier servant de certificat. Attention, ce sera forcément un fichier appelé fullchain.pem lors de l'utilisation de Let's Encrypt. Pensez aussi à adapter l'arborescence.

ssl_certificate_key indique l'emplacement du fichier servant de clé privée. Attention, ce sera forcément un fichier appelé privkey.pem lors de l'utilisation de Let's Encrypt. Pensez aussi à adapter l'arborescence.

ssl_dhparam indique l'emplacement de la clé Diffie-Helman précédemment généré (dans notre cas etc/ssl/private/dh4096.pem)

ssl_ecdh_curve robustesse de la clé utilisé pour les échanges via courbe elliptique.

ssl_prefer_server_ciphers on indique au client que le serveur a des préférences en matière de suite cryptographiques (ciphers) et qu'il précise lesquelles à la ligne suivante.

ssl_ciphers est la liste des combinaisons d'algorithmes de chiffrement.

Les derniers paramètres location et proxy_pass étant identiques à toute configuration d'NginX en reverse proxy.

Forcer l'accès via https

Si vous souhaitez que l'on consulte votre site uniquement en https, il est tout à fait possible de le faire en ajoutant ces lignes à la suite de votre fichier de configuration. L'idéal étant de le faire dans le fichier de configuration du virtualhost.

server {
       listen 80;
            server_name       votrenomde.domaine;
             rewrite ^ https://$server_name$request_uri? permanent;
}
nginx_reverse_proxy_lets_encrypt.txt · Dernière modification: 2021/03/21 16:27 de tom23