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:
-
Un serveur Ubuntu 18.04 configuré en suivantthe Ubuntu 18.04 initial server setup guide, y compris un utilisateur sudo non root et un pare-feu.
-
Nginx installé sur votre serveur, ce que vous pouvez faire en suivantHow To Install Nginx on Ubuntu 18.04.
-
Un nom de domaine configuré pour pointer vers votre serveur. Vous pouvez en acheter un surNamecheap ou en obtenir un gratuitement surFreenom. Vous pouvez apprendre à pointer des domaines vers des gouttelettes DigitalOcean en suivant le didacticiel deHow To Set Up a Host Name with DigitalOcean.
-
Un certificat TLS / SSL configuré pour votre serveur. Vous avez trois options:
-
Vous pouvez obtenir un certificat gratuit deLet’s Encrypt en suivantHow to Secure Nginx with Let’s Encrypt on Ubuntu 18.04.
-
Vous pouvez également générer et configurer un certificat auto-signé en suivantHow to Create a Self-signed SSL Certificate for Nginx in Ubuntu 18.04.
-
Vous pouvezbuy one from another provider et configurer Nginx pour l'utiliser en suivant les étapes 2 à 6 deHow to Create a Self-signed SSL Certificate for Nginx in Ubuntu 18.04.
-
-
Nginx est configuré pour rediriger le trafic du port
80
vers le port443
, ce qui devrait être couvert par les conditions préalables précédentes. -
Nginx est configuré pour utiliser une clé DHE (Ephemeral Diffie-Hellman) de 2 048 bits ou plus, qui devrait également être couverte par les conditions préalables précédentes.
[[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 (View →Developer →Developer Tools) et rechargez la page (View →Reload 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.
À 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é.