Comment configurer Nginx avec la prise en charge HTTP/2 sur Ubuntu 18.04

De Get Docs
Aller à :navigation, rechercher

Une version précédente de ce didacticiel a été écrite par Sergey Zhukaev.

Introduction

Nginx est un serveur Web open source rapide et fiable. Il a gagné sa popularité en raison de sa faible empreinte mémoire, de sa grande évolutivité, de sa facilité de configuration et de la prise en charge d'une grande variété de protocoles.

HTTP/2 est une nouvelle version du protocole de transport hypertexte, utilisé sur le Web pour transmettre des pages du serveur au navigateur. HTTP/2 est la première mise à jour majeure de HTTP depuis près de deux décennies : HTTP1.1 a été présenté au public en 1999, lorsque les pages Web n'étaient généralement qu'un seul fichier HTML avec une feuille de style CSS en ligne. Internet a radicalement changé depuis lors, et nous sommes maintenant confrontés aux limitations de HTTP 1.1 — le protocole limite les vitesses de transfert potentielles pour la plupart des sites Web modernes car il télécharge des parties d'une page dans une file d'attente (la partie précédente doit être complètement téléchargée avant le téléchargement de la partie suivante commence), et une page Web moderne moyenne nécessite environ 100 requêtes à télécharger (chaque requête est une image, un fichier js, un fichier css, etc.).

HTTP/2 résout ce problème car il apporte quelques changements fondamentaux :

  • Toutes les requêtes sont téléchargées en parallèle, pas dans une file d'attente
  • Les en-têtes HTTP sont compressés
  • Les pages sont transférées sous forme binaire, et non sous forme de fichier texte, ce qui est plus efficace
  • Les serveurs peuvent "pousser" les données même sans la demande de l'utilisateur, ce qui améliore la vitesse pour les utilisateurs avec une latence élevée

Même si HTTP/2 ne nécessite pas de cryptage, les développeurs des deux navigateurs les plus populaires, Google Chrome et Mozilla Firefox, ont déclaré que pour des raisons de sécurité, ils ne prendront en charge HTTP/2 que pour les connexions HTTPS. Par conséquent, si vous décidez de configurer des serveurs avec le support HTTP/2, vous devez également les sécuriser avec HTTPS.

Ce tutoriel vous aidera à configurer un serveur Nginx rapide et sécurisé avec prise en charge HTTP/2.

Conditions préalables

Avant de commencer, nous aurons besoin de quelques éléments :

  • Un serveur Ubuntu 18.04 configuré en suivant le guide de configuration initiale du serveur Ubuntu 18.04, y compris un utilisateur sudo non root et un pare-feu.
  • Nginx installé sur votre serveur, ce que vous pouvez faire en suivant Comment installer Nginx sur Ubuntu 18.04.
  • Un nom de domaine configuré pour pointer vers votre serveur. Vous pouvez en acheter un sur Namecheap ou en obtenir un gratuitement sur Freenom. Vous pouvez apprendre à faire pointer des domaines vers des gouttelettes DigitalOcean en suivant la documentation sur Comment gérer votre domaine avec DigitalOcean.
  • Un certificat TLS/SSL configuré pour votre serveur. Vous avez trois options : Vous pouvez obtenir un certificat gratuit de Let's Encrypt en suivant Comment sécuriser Nginx avec Let's Encrypt sur Ubuntu 18.04. Vous pouvez également générer et configurer un certificat auto-signé en suivant Comment créer un certificat SSL auto-signé pour Nginx dans Ubuntu 18.04. Vous pouvez en acheter un auprès d'un autre fournisseur et configurer Nginx pour l'utiliser en suivant les étapes 2 à 6 de Comment créer un certificat SSL auto-signé pour Nginx dans Ubuntu 18.04.
  • Nginx configuré pour rediriger le trafic du port 80 vers le port 443, qui doit être couvert par les prérequis précédents.
  • Nginx configuré pour utiliser une clé Ephemeral Diffie-Hellman (DHE) de 2048 bits ou plus, qui doit également être couverte par les prérequis précédents.

Étape 1 - Activation de la prise en charge HTTP/2

Si vous avez suivi l'étape de configuration du bloc de serveur dans le didacticiel d'installation de Nginx , vous devriez avoir un bloc de serveur pour votre domaine sur /etc/nginx/sites-available/your_domain avec la directive server_name déjà définie de manière appropriée. Le premier changement que nous ferons sera de modifier le bloc serveur de votre domaine pour utiliser HTTP/2.

Ouvrez le fichier de configuration de votre domaine :

sudo nano /etc/nginx/sites-available/your_domain

Dans le fichier, localisez les variables listen associées au port 443 :

/etc/nginx/sites-available/<^>votre_domaine<^>

...
    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl; 
...

Le premier concerne les connexions IPv6. Le second est pour toutes les connexions IPv4. Nous allons activer HTTP/2 pour les deux.

Modifiez chaque directive listen pour inclure http2 :

/etc/nginx/sites-available/<^>votre_domaine<^>

...
    listen [::]:443 ssl http2 ipv6only=on; 
    listen 443 ssl http2; 
...

Cela indique à Nginx d'utiliser HTTP/2 avec les navigateurs pris en charge.

Enregistrez le fichier de configuration et quittez l'éditeur de texte.

Chaque fois que vous apportez des modifications aux fichiers de configuration Nginx, vous devez vérifier la configuration pour les erreurs de syntaxe, comme ceci :

sudo nginx -t

Si la syntaxe est sans erreur, vous verrez le résultat suivant :

Sortie de sudo nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Ensuite, nous allons configurer notre serveur pour utiliser une liste de chiffrements plus restrictive.

Étape 2 - Suppression des suites de chiffrement anciennes et non sécurisées

HTTP/2 a une liste noire de chiffrements anciens et non sécurisés, nous devons donc les éviter. Les suites de chiffrement sont des algorithmes cryptographiques qui décrivent comment les données transférées doivent être chiffrées.

La méthode que vous utiliserez pour définir les chiffrements dépend de la façon dont vous avez configuré vos certificats TLS/SSL pour Nginx.

Si vous avez utilisé Certbot pour obtenir vos certificats, il a également créé le fichier /etc/letsencrypt/options-ssl-nginx.conf qui contient des chiffrements qui ne sont pas assez forts pour HTTP/2. La modification de ce fichier empêchera malheureusement Certbot d'appliquer les mises à jour à l'avenir, nous dirons donc simplement à Nginx de ne pas utiliser ce fichier et nous spécifierons notre propre liste de chiffrements.

Ouvrez le fichier de configuration du bloc de serveur pour votre domaine :

sudo nano /etc/nginx/sites-available/your_domain

Localisez la ligne qui inclut le fichier options-ssl-nginx.conf et commentez-la :

/etc/nginx/sites-available/<^>votre_domaine<^>

    # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>

Sous cette ligne, ajoutez cette ligne pour définir les chiffrements autorisés :

/etc/nginx/sites-available/<^>votre_domaine<^>

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Enregistrez le fichier et quittez l'éditeur.

Si vous avez utilisé des certificats auto-signés ou utilisé un certificat d'un tiers et l'avez configuré selon les prérequis, ouvrez le fichier /etc/nginx/snippets/ssl-params.conf dans votre éditeur de texte :

sudo nano /etc/nginx/snippets/ssl-params.conf

Localisez la ligne suivante :

/etc/nginx/snippets/ssl-params.conf

...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...

Modifiez-le pour qu'il ressemble à ceci :

/etc/nginx/snippets/ssl-params.conf

...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Enregistrez le fichier et quittez votre éditeur.

Encore une fois, vérifiez la configuration pour les erreurs de syntaxe :

sudo nginx -t

Si vous voyez des erreurs, corrigez-les et testez à nouveau.

Une fois que vous ne voyez aucune erreur de syntaxe, redémarrez Nginx :

sudo systemctl reload nginx

Avec le serveur redémarré, vérifions qu'il fonctionne.

Étape 3 - Vérification que HTTP/2 est activé

Assurons-nous que le serveur est en cours d'exécution et fonctionne avec HTTP/2.

Utilisez la commande curl pour faire une requête sur votre site et afficher les en-têtes :

curl -I -L https://your_domain

Vous verrez le résultat suivant :

OutputHTTP/1.1 301 Moved Permanently
Server: nginx/1.14.0 (Ubuntu)
Date: Fri, 06 Jul 2018 19:07:12 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Location: https://your_domain/

HTTP/2 200
server: nginx/1.14.0 (Ubuntu)
date: Fri, 06 Jul 2018 19:07:12 GMT
content-type: text/html
content-length: 16
last-modified: Fri, 06 Jul 2018 16:55:37 GMT
etag: "5b3f9f09-10"
accept-ranges: bytes

Vous pouvez également vérifier que HTTP/2 est utilisé dans Google Chrome. Ouvrez Chrome et accédez à http://your_domain. Ouvrez les outils de développement Chrome (View -> Developer -> Developer Tools) et rechargez la page (View -> Recharger cette page ). Accédez à l'onglet Réseau, cliquez avec le bouton droit sur la ligne d'en-tête du tableau qui commence par Nom, puis sélectionnez l'option Protocole dans le menu contextuel.

Vous verrez h2 (qui signifie HTTP/2) dans une nouvelle colonne Protocol, indiquant que HTTP/2 fonctionne.

À ce stade, vous êtes prêt à diffuser du contenu via le protocole HTTP/2. Améliorons la sécurité et les performances en activant HSTS.

Étape 4 - Activation de HTTP Strict Transport Security (HSTS)

Même si vos requêtes HTTP sont redirigées vers HTTPS, vous pouvez activer HTTP Strict Transport Security (HSTS) pour éviter d'avoir à effectuer ces redirections. Si le navigateur trouve un en-tête HSTS, il n'essaiera pas de se reconnecter au serveur via HTTP normal pendant une période donnée. Quoi qu'il en soit, il échangera des données en utilisant uniquement une connexion HTTPS cryptée. Cet en-tête nous protège également des attaques de rétrogradation du protocole [1].

Ouvrez le fichier de configuration Nginx dans votre éditeur :

sudo nano /etc/nginx/nginx.conf

Ajoutez cette ligne au fichier pour activer HSTS :

/etc/nginx/nginx.conf

http {
...
    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    add_header Strict-Transport-Security "max-age=15768000" always;
}
...

Le max-age est réglé en secondes. La valeur 15768000 équivaut à 6 mois.

Par défaut, cet en-tête n'est pas ajouté aux demandes de sous-domaine. Si vous avez des sous-domaines et que vous souhaitez que le HSTS s'applique à tous, vous devez ajouter la variable includeSubDomains à la fin de la ligne, comme ceci :

/etc/nginx/nginx.conf

add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

Enregistrez le fichier et quittez l'éditeur.

Encore une fois, vérifiez la configuration pour les erreurs de syntaxe :

sudo nginx -t

Enfin, redémarrez le serveur Nginx pour appliquer les modifications.

sudo systemctl reload nginx

Conclusion

Votre serveur Nginx sert maintenant des pages HTTP/2. Si vous souhaitez tester la solidité de votre connexion SSL, veuillez visiter Qualys SSL Lab et exécuter un test sur votre serveur. Si tout est correctement configuré, vous devriez obtenir une note A+ pour la sécurité.