A previous version of this tutorial was written by Sergey Zhukaev.
Introduction
Nginx est un serveur web open-source rapide et fiable. Il a gagné en popularité en raison de son empreinte mémoire réduite, de sa grande évolutivité, de sa facilité de configuration et de son support pour une grande variété de protocoles.
HTTP/2 est une version plus récente du protocole de transport hypertexte, utilisé sur le Web pour distribuer les pages du serveur au navigateur. HTTP/2 est la première mise à jour majeure d’HTTP depuis près de deux décennies : HTTP 1.1 a été introduit auprès du public en 1999, lorsque les pages Web étaient beaucoup plus petites. Internet a considérablement évolué depuis lors, et nous sommes maintenant 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 les parties d’une page dans une file d’attente – la partie précédente doit être entièrement téléchargée avant que le téléchargement de la partie suivante ne commence – et une page Web moderne moyenne télécharge des dizaines de ressources individuelles telles que CSS, javascript et images.
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 en binaire, pas en tant que fichier texte, ce qui est plus efficace
- Les serveurs peuvent « pousser » des 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 chiffrement, 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 le support HTTP/2.
Prérequis
Avant de commencer, vous aurez besoin de quelques éléments:
- Un serveur Ubuntu 22.04 configuré en suivant le guide de configuration initiale du serveur Ubuntu 22.04, comprenant un utilisateur non-root avec sudo et un pare-feu.
- Nginx installé sur votre serveur, ce que vous pouvez faire en suivant Comment installer Nginx sur Ubuntu 22.04.
- A domain name configured to point to your server. You can purchase one on Namecheap or get one for free on Freenom. You can learn how to point domains to DigitalOcean Droplets by following the documentation on How To Manage Your Domain With DigitalOcean.
- A TLS/SSL certificate configured for your server. You have two options:
- Vous pouvez obtenir un certificat gratuit de Let’s Encrypt en suivant Comment sécuriser Nginx avec Let’s Encrypt sur Ubuntu 22.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 22.04.
- Nginx est configuré pour rediriger le trafic du port
80
vers le port443
, ce qui devrait être couvert par les prérequis précédents. - Nginx est configuré pour utiliser une clé Diffie-Hellman éphémère (DHE) de 2048 bits ou plus, ce qui devrait également être couvert par les prérequis précédents.
Étape 1 — Activation du support HTTP/2
Si vous avez suivi l’étape de configuration du bloc serveur dans le tutoriel d’installation de Nginx, vous devriez avoir un bloc serveur pour votre domaine dans /etc/nginx/sites-available/votre_domaine
avec la directive server_name
déjà définie correctement. Le premier changement que nous allons apporter sera de modifier le bloc serveur de votre domaine pour utiliser HTTP/2.
Ouvrez le fichier de configuration pour votre domaine en utilisant nano
ou votre éditeur préféré :
Dans le fichier, localisez les variables listen
associées au port 443
:
...
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
...
Le premier est pour les connexions IPv6. Le deuxième est pour toutes les connexions IPv4. Nous activerons HTTP/2 pour les deux.
Modifiez chaque directive listen
pour inclure http2
:
...
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. Si vous utilisez nano
, appuyez sur Ctrl+X
puis, lorsque vous y êtes invité, sur Y
puis sur Entrée.
Chaque fois que vous apportez des modifications aux fichiers de configuration de Nginx, vous devez vérifier la configuration des erreurs, en utilisant le drapeau -t
, qui exécute la commande de vérification de syntaxe intégrée de Nginx :
Si la syntaxe est exempte d’erreurs, vous recevrez une sortie comme celle-ci :
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Ensuite, vous configurerez votre serveur Nginx pour utiliser une liste de chiffrements plus restrictifs afin d’améliorer la sécurité de votre serveur.
Étape 2 — Suppression des suites de chiffrement anciennes et non sécurisées
HTTP/2 a une liste noire de vieilles suites de chiffrement non sécurisées à é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épendra 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 sécurisés pour HTTP/2. Cependant, modifier ce fichier empêchera Certbot d’appliquer des mises à jour à l’avenir, donc nous allons simplement dire à Nginx de ne pas utiliser ce fichier et nous spécifierons notre propre liste de chiffrements.
Ouvrez le fichier de configuration du bloc serveur pour votre domaine:
sudo nano /etc/nginx/sites-enabled/your_domain
Localisez la ligne qui inclut le fichier options-ssl-nginx.conf
et commentez-la en ajoutant un caractère #
au début de la ligne:
# 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:
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 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:
Localisez la ligne suivante:
...
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-la pour utiliser la liste suivante de chiffrements:
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
Enregistrez le fichier et quittez votre éditeur.
Une fois de plus, vérifiez la configuration pour les erreurs de syntaxe en utilisant la commande nginx -t
:
Si vous rencontrez des erreurs, corrigez-les et testez à nouveau.
Une fois votre configuration passée le contrôle de syntaxe, redémarrez Nginx en utilisant la commande systemctl
:
Avec le serveur redémarré, vérifions qu’il fonctionne.
Étape 3 — Vérification de l’activation d’HTTP/2
Assurons-nous que le serveur fonctionne avec HTTP/2.
Utilisez la commande curl
pour effectuer une requête vers votre site et afficher les en-têtes:
Vous recevrez une sortie similaire à celle-ci:
HTTP/2 200
**Server**: nginx/1.18.0 (Ubuntu)
**Date**: Tue, 21 Jun 2022 22:19:09 GMT
**Content-Type**: text/html
**Content-Length**: 612
**Last-Modified**: Tue, 21 Jun 2022 22:17:56 GMT
**Connection**: keep-alive
**ETag**: "62b24394-264"
**Accept-Ranges**: bytes
Vous pouvez également vérifier l’utilisation d’HTTP/2 dans Google Chrome. Ouvrez Chrome et accédez à https://votre_domaine
. Ouvrez les outils de développement Chrome (Affichage -> Développeur -> Outils de développement) et rechargez la page (Affichage -> Recharger cette page). Accédez à l’onglet Réseau, cliquez avec le bouton droit sur la ligne d’en-tête du tableau commençant par Nom, et sélectionnez l’option Protocole dans le menu contextuel.
Vous aurez une nouvelle colonne Protocole qui contient h2
(qui signifie HTTP/2), 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 la sécurité de transport strict HTTP (HSTS)
Même si vos requêtes HTTP redirigent vers HTTPS, vous pouvez activer la sécurité de transport strict HTTP (HSTS) pour éviter d’avoir à effectuer ces redirections. Si le navigateur trouve un en-tête HSTS, il ne tentera pas de se connecter au serveur via HTTP régulier à nouveau pour une période de temps donnée. Quoi qu’il arrive, il échangera des données uniquement via une connexion HTTPS chiffrée. Cet en-tête nous protège également des attaques de rétrogradation de protocole.
Ouvrez à nouveau le fichier de configuration du bloc serveur pour votre domaine:
sudo nano /etc/nginx/your_domain
Ajoutez cette ligne au même bloc du fichier contenant les chiffres SSL pour activer HSTS:
server {
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
add_header Strict-Transport-Security "max-age=15768000" always;
}
...
La valeur max-age
est définie en secondes. La valeur 15768000
équivaut à 6 mois.
Par défaut, cet en-tête n’est pas ajouté aux requêtes de sous-domaine. Si vous avez des sous-domaines et que vous souhaitez que HSTS s’applique à tous, vous devriez ajouter la variable includeSubDomains
à la fin de la ligne, comme ceci:
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
Enregistrez le fichier et quittez l’éditeur.
Une fois de plus, vérifiez la configuration pour les erreurs de syntaxe:
Enfin, redémarrez le serveur Nginx pour appliquer les changements.
Conclusion
Votre serveur Nginx sert désormais des pages HTTP/2. Si vous souhaitez tester la résistance de votre connexion SSL, veuillez visiter Qualys SSL Lab et effectuer un test sur votre serveur. Si tout est configuré correctement, vous devriez obtenir une note A+ en matière de sécurité.
Pour en savoir plus sur la façon dont Nginx analyse et met en œuvre les règles de bloc de serveur, essayez de lire Comprendre les algorithmes de sélection de blocs de serveurs et de localisation de Nginx.