Comment configurer Nginx avec le support HTTP / 2 sur Ubuntu 18.04

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

introduction

Nginx est un serveur Web open source rapide et fiable. Il a gagné sa popularité en raison de son faible encombrement en 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 is a new version of the Hypertext Transport Protocol, which is used on the Web to deliver pages from server to browser. HTTP/2 is the first major update of HTTP in almost two decades: HTTP1.1 was introduced to the public back in 1999 when webpages were usually just a single HTML file with inline CSS stylesheet. L'Internet a radicalement changé depuis lors, et maintenant nous sommes confrontés aux limites 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 téléchargée complètement 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 solves this problem because it brings a few fundamental changes:

  • Toutes les demandes 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 de fichier binaire, pas 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 de traitement des 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 répandus, Google Chrome et Mozilla Firefox, ont déclaré que, pour des raisons de sécurité, ils ne prendraient en charge HTTP / 2 que pour les connexions HTTPS. Par conséquent, si vous décidez de configurer des serveurs prenant en charge HTTP / 2, vous devez également les sécuriser avec HTTPS.

Ce didacticiel vous aidera à configurer un serveur Nginx rapide et sécurisé prenant en charge HTTP / 2.

Conditions préalables

Avant de commencer, nous aurons besoin de quelques choses:

[[step-1 -—- enabled-http-2-support]] == Étape 1 - Activation de la prise en charge HTTP / 2

Si vous avez suivi lesserver block set up step in the Nginx installation tutorial, vous devriez avoir un bloc serveur pour votre domaine à/etc/nginx/sites-available/your_domain avec la directive `nom_serveur` déjà définie correctement. Le premier changement que nous ferons consistera à 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, recherchez les variableslisten associées au port443:

your_domain’>/etc/nginx/sites-available/your_domain

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

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

Modifiez chaque directivelisten pour inclurehttp2:

your_domain’>/etc/nginx/sites-available/your_domain

...
    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 éditez l’éditeur de texte.

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

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

Nous allons ensuite configurer notre serveur pour utiliser une liste de chiffrements plus restrictive.

[[step-2 -—- remove-old-and-unsecure-cipher-suites]] == Étape 2 - Suppression des suites de chiffrement anciennes et non sécurisées

HTTP/2 has a blacklist of old and insecure ciphers, so we must avoid them. Les suites de chiffrement sont des algorithmes de chiffrement décrivant 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 manière 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 puissants pour HTTP / 2. La modification de ce fichier empêchera malheureusement Certbot d’appliquer des mises à jour à l’avenir. Nous allons donc simplement dire à Nginx de ne pas utiliser ce fichier et nous allons spécifier notre propre liste de chiffrements.

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

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

Localisez la ligne qui contient le fichieroptions-ssl-nginx.conf et commentez-la:

your_domain’>/etc/nginx/sites-available/your_domain

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

En dessous de cette ligne, ajoutez cette ligne pour définir les chiffrements autorisés:

your_domain’>/etc/nginx/sites-available/your_domain

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 que vous 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 plus d'erreur de syntaxe, redémarrez Nginx:

sudo systemctl reload nginx

Avec le serveur redémarré, vérifions que cela fonctionne.

[[step-3 -—- vérifier-que-http-2-is-enabled]] == Étape 3 - Vérifier que HTTP / 2 est activé

Assurez-vous que le serveur fonctionne et fonctionne avec HTTP / 2.

Utilisez la commandecurl pour faire une requête à 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 (ViewDeveloperDeveloper Tools) et rechargez la page (ViewReload This Page). Accédez à l'ongletNetwork, cliquez avec le bouton droit sur la ligne d'en-tête du tableau qui commence parName et sélectionnez l'optionProtocol dans le menu contextuel.

Vous verrezh2 (qui signifie HTTP / 2) dans une nouvelle colonneProtocol, indiquant que HTTP / 2 fonctionne.

Chrome Developer Tools HTTP/2 check

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

[[step-4 -—- enabled-http-strict-transport-security-hsts]] == Étape 4 - Activation de HTTP Strict Transport Security (HSTS)

Même si vos requêtes HTTP redirigent vers HTTPS, vous pouvez activerHTTP 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 connecter au serveur via HTTP de nouveau pendant une période donnée. Quoi qu’il en soit, il échangera des données en utilisant uniquement une connexion HTTPS chiffrée. Cet en-tête nous protège également du protocoledowngrade attacks.

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;
}
...

Lemax-age est défini en secondes. La valeur15768000 é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 HSTS s'applique à tous, vous devez ajouter la variableincludeSubDomains à 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 force de votre connexion SSL, veuillez visiterQualys SSL Lab et lancer un test sur votre serveur. Si tout est configuré correctement, vous devriez obtenir une marque A + pour la sécurité.