Comment Configurer Nginx avec le Support de HTTP / 2 sur Ubuntu 18.04

Configurer Nginx avec le Support de HTTP / 2 sur Ubuntu

Introduction :

Nginx est connu pour sa vitesse et sa fiabilité en tant que serveur web open source. Il est connu pour sa faible mémoire, sa grande flexibilité, sa configuration facile et sa prise en charge de nombreux protocoles.

L’Hypertexte Transport Protocole est l’origine du récent HTTP/2, ce dernier est utilisé sur le Web pour fournir des pages du serveur au navigateur. HTTP/2 est la première mise à jour majeure de HTTP dans près de vingt ans : HTTP 1.1 a été présenté au public à la fin du 20e siècle lorsque les pages Web n’étaient qu’un seul fichier HTML avec la feuille de style CSS.

Une évolution radicale s’est produit sur Internet après cela, confrontés par les limitations de HTTP 1.1.

Il baissait les vitesses de transfert possibles pour la plupart des sites Web modernes.
Ce protocole télécharge des parties d’une page dans une file d’attente, donc chaque page Web moderne doit en moyenne télécharger environ 100 requêtes.

Pour quoi HTTP/2 :

HTTP/2 apporte une solution à ce problème grâce à quelques modifications de base :

  • Le téléchargement des requêtes se fait plutôt en parallèle que dans une file d’attente.
  • Les en-têtes HTTP sont compressés.
  • Le transfert de pages ne se fait pas comme un fichier texte, mais plutôt comme un binaire pour de meilleurs résultats.
  • Les serveurs peuvent envoyer les données même sans la demande de l’utilisateur, ce qui améliore la vitesse pour les utilisateurs à haute latence.
  • Les données peuvent être envoyées par les serveurs peu importe la demande de l’utilisateur, ce qui est utile aux utilisateurs à haute latence, ce qui leur donne plus de vitesse.

Pour des raisons de sécurité, les développeurs de Google Chrome et Mozilla Firefox, les navigateurs les plus utilisés sur Internet, ont déclaré qu’ils prendraient en charge HTTP/2 uniquement pour les connexions HTTPS.

Ainsi, vous devrez également les sécuriser avec HTTPS si vous décidez d’utiliser le support HTTP/2 pour configurer les serveurs.

Nous vous fournissons ce guide qui vous aidera à utiliser le support HTTP/2 pour créer un serveur Nginx rapide et sécurisé.

Prérequis :

Avant de commencer, ces choses sont essentielles :

  • Configurez un serveur Ubuntu 18.04 à l’aide du guide de configuration initiale du serveur Ubuntu 18.04, y compris un utilisateur sudo non-root et un pare-feu.
  • Installez Nginx sur votre serveur.
  • Configurez un nom de domaine pour pointer vers votre serveur. Le nom de domaine peut être acheté à un bon prix ici.
  • Configurez un certificat TLS / SSL pour votre serveur. Il y a trois possibilités :
    • Obtenir un certificat gratuit de Let’s Encrypt
    • Générer et configurer un certificat autosigné
    • L’acheter auprès d’un autre fournisseur et configurer Nginx pour l’utiliser.
  • Configurez Nginx pour rediriger le trafic du port 80 vers le port 443 qui est préalablement couvert par les prérequis.
  • Configurez Nginx pour utiliser une clé 2048 bits ou une clé Ephemeral Diffie-Hellman (DHE) plus forte, qui devrait également figurer dans les prérequis précédents.

Étape 1 – Activation du support HTTP/2

Tout d’abord, votre domaine devrait déjà avoir une valeur (server block) dans  /etc/nginx/sites-available/your_domain avec la directive server_name correctement définie. La première modification à faire sera d’autoriser la valeur (server block) de votre domaine à utiliser HTTP/2 en le modifiant.

Lancez le fichier de configuration de votre domaine :

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

Localisez les variables listen liées au port 443 dans le fichier :

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

La première variable appartient aux connexions IPv6 et la deuxième est pour toutes les connexions IPv4. HTTP/2 doit être activé pour les deux.

Chaque directive listen doit être modifiée pour inclure http2:

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

Cela demande l’utilisation de HTTP/2 de Nginx avec les navigateurs pris en charge.

Modifiez l’éditeur de texte après avoir enregistré le fichier de configuration.

Chaque fois que des modifications sont apportées aux fichiers de configuration de Nginx, faites attention aux erreurs de syntaxe dans la configuration, via :

$ sudo nginx -t

L’output suivant apparaîtra si la syntaxe ne contient pas d’erreur :

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

Après cela, notre serveur doit être configuré pour permettre l’utilisation d’une liste de cryptogramme plus définie.

Étape 2 – Suppression d’ensemble de cryptogrammes anciens et non sécurisés

Il existe une liste noire de cryptogrammes anciens et non sécurisés dans HTTP/2 qui doit être évitée. Les ensembles de cryptogrammes sont des algorithmes cryptographiques décrivant la façon dont les données transférées doivent être chiffrées.

La méthode que vous êtes censé utiliser pour définir les cryptogrammes dépend de la configuration que vous avez choisie pour vos certificats TLS / SSL de Nginx.

Si vous avez obtenu vos certificats via Certbot, le fichier  /etc/letsencrypt/options-ssl-nginx.conf a été créé et contient des ciphers qui ne sont pas assez puissants pour HTTP/2. Malheureusement, cela empêcherait Certbot d’appliquer des mises à jour à l’avenir si ce fichier est modifié. Dans ce cas, nous demanderons à Nginx de ne pas utiliser ce fichier tout en spécifiant notre propre liste de ciphers.

Lancez le fichier de configuration de la valeur (server block) de votre domaine :

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

Identifiez la ligne contenant le fichier options-ssl-nginx.conf et enlevez le commentaire:

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

Ajoutez la ligne suivante sous celle-ci afin de définir les cryptogrammes autorisés:

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

Quittez l’éditeur après avoir enregistré le fichier.

Dans votre éditeur de texte, ouvrez le fichier /etc/nginx/snippets/ssl-params.conf si vous avez utilisé des certificats autosignés ou celui d’un tiers que vous aviez configuré en fonction des prérequis :

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

Trouvez cette ligne :

...
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 qu’elle ressemble à ceci :

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

Quittez l’éditeur après avoir enregistré le fichier.

Assurez-vous, cette fois aussi, de vérifier les erreurs de syntaxe dans la configuration :

$ sudo nginx -t

Si vous identifiez une erreur, corrigez-la, puis testez à nouveau.

Redémarrez Nginx une fois qu’il n’y a plus d’erreurs de syntaxe

$ sudo systemctl restart nginx

Vérifions que le serveur fonctionne après son redémarrage.

Étape 3 – Vérifier que HTTP/2 est Activé

Nous devons vérifier que le serveur est opérationnel et qu’il peut fonctionner avec HTTP/2.

Faites une requête à votre site en utilisant la commande curl et affichez les en-têtes :

$ curl -I -L https://your_domain

L’output suivant apparaîtra :

Il est également possible de vérifier que HTTP/2 est exécuté sur Google Chrome. Lancez Chrome et accédez à http://your_domain. Ouvrez “Chrome Developer Tools” puis rechargez la page. Accédez à l’onglet Network, cliquez avec le bouton droit sur la ligne d’en-tête du tableau commençant par Nom, ensuite sélectionnez l’option Protocole dans le menu déroulant.

Vous verrez h2 (faisant référence à HTTP/2) dans une nouvelle colonne Protocol, qui indique que HTTP/2 est opérationnel.

HTTP/2 Support on Ubuntu nginx

Vous êtes maintenant prêt à diffuser du contenu à l’aide du protocole HTTP/2. Passons à l’augmentation de la sécurité et de la performance en activant HSTS.

Étape 4 – Activer le HTTP Strict Transport Security (HSTS)

Vous pouvez activer HTTP Strict Transport Security (HSTS) pour éviter les redirections vers HTTPS même si votre HTTP le demande. Si le navigateur identifie un en-tête HSTS, il ne tentera pas de se connecter à nouveau au serveur via un HTTP normal pendant un certain moment. Quoi qu’il en soit, il utilisera une connexion HTTPS chiffrée uniquement pour échanger des données. Cet en-tête nous protège également des attaques de rétrogradation de protocole (protocol downgrade).

Dans votre éditeur, ouvrez le fichier de configuration de Nginx : 

sudo nano /etc/nginx/nginx.conf

Ajoutez cette ligne au fichier afin d’activer HSTS:

http {
...
    ##
    # Virtual Host Configs
    ##
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    add_header Strict-Transport-Security "max-age=15768000" always;
}
...

max-age est défini en secondes. La valeur 15768000 est égale à 6 mois.

Cet en-tête n’est pas ajouté aux requêtes du sous-domaine par défaut. Si vous avez des sous-domaines et que vous souhaitez les appliquer par HSTS, ajoutez la variable includeSubDomains à la fin de la ligne comme ceci :

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

Quittez l’éditeur après avoir enregistré le fichier.

Vérifiez cette fois également les erreurs de syntaxe dans la configuration :

$ sudo nginx -t

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

$ sudo systemctl restart nginx

Conclusion

Votre serveur Nginx sert désormais des pages HTTP/2. Exécutez un test sur votre serveur si vous souhaitez tester la force de votre connexion SSL.

Laisser un commentaire