HTTPS avec un certificat auto-signé sur Nginx sous Linux

CompTIABeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez comment sécuriser un serveur web Nginx sous Linux en implémentant HTTPS avec un certificat auto-signé. Vous commencerez par installer le serveur web Nginx et vous assurer qu'il fonctionne correctement, établissant ainsi les bases d'une configuration sécurisée. Suite à la configuration initiale, vous utiliserez la boîte à outils OpenSSL pour générer un certificat SSL auto-signé, un composant essentiel pour activer les communications cryptées.

Une fois le certificat créé, vous procéderez à la modification de la configuration Nginx pour servir du contenu web via le protocole sécurisé HTTPS. Les dernières étapes du laboratoire se concentrent sur la vérification et les tests. Vous activerez la nouvelle configuration et utiliserez des outils en ligne de commande tels que curl et openssl pour tester la connexion HTTPS et inspecter les détails de votre certificat auto-signé nouvellement créé, confirmant ainsi que votre serveur est correctement sécurisé.

Installer et démarrer le serveur web Nginx

Dans cette étape, vous allez installer le serveur web Nginx. Nginx est un serveur web haute performance largement utilisé pour servir du contenu web. Nous allons d'abord l'installer, puis vérifier qu'il fonctionne correctement. Cette instance Nginx en cours d'exécution servira de base à notre configuration HTTPS ultérieure.

Tout d'abord, il est recommandé de mettre à jour la liste des paquets de votre système afin de vous assurer que vous obtenez les dernières versions des logiciels.

Exécutez la commande suivante dans votre terminal :

sudo apt update

Vous verrez le système récupérer les informations des paquets à partir de ses sources configurées. La sortie ressemblera à ceci :

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
...
Fetched 1,585 kB in 2s (924 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.

Maintenant, vous pouvez procéder à l'installation de Nginx. Nous utiliserons la commande apt install. Le drapeau -y est ajouté pour confirmer automatiquement l'installation, évitant ainsi toute invite interactive.

sudo apt install nginx -y

Le processus d'installation téléchargera et configurera Nginx ainsi que ses dépendances. Une fois terminé, vous devriez voir une sortie indiquant que le paquet nginx a été configuré.

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  nginx-common nginx-core
...
Setting up nginx-common (1.18.0-6ubuntu14.4) ...
Setting up nginx-core (1.18.0-6ubuntu14.4) ...
Setting up nginx (1.18.0-6ubuntu14.4) ...
Processing triggers for ufw (0.36.1-4ubuntu0.1) ...
Processing triggers for man-db (2.10.2-1) ...

Bien que le processus d'installation démarre souvent le service, il est préférable de le gérer explicitement. Nous utiliserons systemctl, l'utilitaire standard pour contrôler les services sur les systèmes Linux modernes.

Démarrez le service Nginx avec cette commande :

sudo systemctl start nginx

Cette commande ne produira aucune sortie si elle s'exécute avec succès. Pour confirmer que le service est en cours d'exécution, vérifiez son état.

sudo systemctl status nginx

La sortie fournira des informations détaillées sur le service. Recherchez la ligne Active: active (running), qui confirme que Nginx est opérationnel.

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-30 08:30:00 UTC; 5s ago
       Docs: man:nginx(8)
   Main PID: 1234 (nginx)
      Tasks: 2 (limit: 4617)
     Memory: 4.8M
        CPU: 43ms
     CGroup: /system.slice/nginx.service
             ├─1234 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             └─1235 "nginx: worker process"

Vous avez maintenant installé et démarré avec succès le serveur web Nginx. Dans l'étape suivante, vous générerez un certificat numérique, qui est une condition préalable à l'activation de HTTPS.

Générer un certificat SSL auto-signé avec OpenSSL

Dans cette étape, vous allez créer un certificat numérique auto-signé et sa clé privée correspondante. Pour activer HTTPS, un serveur web a besoin d'un certificat numérique pour prouver son identité aux clients et d'une clé privée pour établir une connexion sécurisée et cryptée. Nous utiliserons l'outil en ligne de commande openssl, un utilitaire robuste pour travailler avec SSL/TLS.

Un certificat numérique lie une clé publique à une identité (comme le nom de domaine d'un site web). Normalement, les certificats sont émis et signés par une Autorité de Certification (CA) de confiance. Cependant, à des fins de test et de développement, nous pouvons créer un certificat auto-signé, qui est signé par son propre créateur. Bien que les navigateurs afficheront un avertissement de sécurité pour de tels certificats, ils sont parfaitement fonctionnels pour un environnement de laboratoire comme celui-ci.

Tout d'abord, créons un répertoire dédié dans le dossier de configuration Nginx pour stocker notre certificat SSL et notre clé. Cela permet de garder nos fichiers organisés et sécurisés.

sudo mkdir -p /etc/nginx/ssl

Maintenant, nous allons utiliser une seule commande openssl pour générer à la fois la clé privée RSA de 2048 bits et le certificat auto-signé, valide pendant 365 jours. Nous les placerons directement dans le répertoire /etc/nginx/ssl/.

Voici une description des options de la commande :

  • req -x509: Crée un certificat auto-signé.
  • -nodes: Empêche le chiffrement de la clé privée avec une phrase secrète. Ceci est important pour que Nginx puisse démarrer sans intervention manuelle.
  • -days 365: Définit la période de validité du certificat à un an.
  • -newkey rsa:2048: Génère une nouvelle clé privée RSA de 2048 bits.
  • -keyout: Spécifie le fichier de sortie pour la clé privée (/etc/nginx/ssl/nginx.key).
  • -out: Spécifie le fichier de sortie pour le certificat (/etc/nginx/ssl/nginx.crt).
  • -subj: Fournit les informations du sujet du certificat de manière non interactive. CN=localhost est le Common Name (Nom Commun), qui doit correspondre à l'adresse que vous utilisez pour accéder au site.

Exécutez la commande suivante :

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/nginx/ssl/nginx.key \
  -out /etc/nginx/ssl/nginx.crt \
  -subj "/C=US/ST=State/L=City/O=LabOrg/OU=IT/CN=localhost"

Après avoir exécuté la commande, vous verrez une sortie confirmant la génération de la clé.

Generating a RSA private key
writing new private key to '/etc/nginx/ssl/nginx.key'
-----

La clé privée (/etc/nginx/ssl/nginx.key) est extrêmement sensible. Si elle est compromise, un attaquant pourrait usurper l'identité de votre serveur. Par conséquent, il est essentiel de restreindre ses permissions de fichier afin que seul l'utilisateur root puisse la lire.

sudo chmod 600 /etc/nginx/ssl/nginx.key

Cette commande définit les permissions de lecture et d'écriture uniquement pour le propriétaire (root), et aucune permission pour les autres. C'est une mesure de sécurité cruciale.

Excellent ! Vous avez maintenant créé un certificat auto-signé (nginx.crt) et une clé privée sécurisée (nginx.key). Dans l'étape suivante, vous configurerez Nginx pour utiliser ces deux fichiers afin d'activer HTTPS.

Configurer Nginx pour servir du contenu via HTTPS

Dans cette étape, vous allez modifier la configuration de Nginx pour activer HTTPS. Avec le certificat et la clé privée prêts de l'étape précédente, vous devez maintenant indiquer à Nginx de les utiliser. Cela implique de modifier le fichier de configuration du site Nginx pour écouter sur le port 443 (le port standard pour HTTPS) et de spécifier les chemins de vos fichiers de certificat et de clé.

Avant de modifier un fichier de configuration, il est conseillé d'en créer une sauvegarde. Cela vous permet de revenir facilement à l'état d'origine si quelque chose se passe mal. Sauvegardons le fichier de configuration du site Nginx par défaut.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

Maintenant, vous allez éditer le fichier de configuration principal à l'aide de l'éditeur de texte nano. Ce fichier contient des blocs de serveur qui définissent comment Nginx gère les requêtes entrantes.

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

Dans l'éditeur nano, vous verrez un bloc de serveur par défaut configuré pour HTTP sur le port 80. Faites défiler vers le bas jusqu'à trouver la section de configuration SSL, qui est généralement commentée. Vous devez décommenter cette section et vous assurer qu'elle correspond à la configuration ci-dessous. Ce bloc indique à Nginx d'écouter les connexions sécurisées sur le port 443 et spécifie quel certificat et quelle clé utiliser pour la négociation TLS (TLS handshake).

Supprimez le bloc de serveur SSL commenté existant et remplacez-le par le contenu suivant, ou simplement décommentez-le et modifiez-le pour qu'il corresponde.

## --- CONTENT TO ADD/UNCOMMENT IN /etc/nginx/sites-available/default ---
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    server_name localhost;

    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    location / {
        try_files $uri $uri/ =404;
    }
}
## --- END CONTENT ---

Voici ce que signifient ces directives :

  • listen 443 ssl: Indique à Nginx d'écouter les connexions entrantes sur le port 443 et de les gérer en utilisant le protocole SSL/TLS.
  • server_name localhost: Définit quel bloc de serveur utiliser pour les requêtes vers localhost.
  • ssl_certificate: Spécifie le chemin de votre fichier de certificat public (nginx.crt).
  • ssl_certificate_key: Spécifie le chemin de votre fichier de clé privée (nginx.key).

Après avoir ajouté le contenu, enregistrez le fichier et quittez nano en appuyant sur Ctrl+X, puis Y, et enfin Entrée.

Avant d'appliquer les modifications, il est crucial de tester la configuration Nginx pour détecter toute erreur de syntaxe. Cela évite qu'une configuration incorrecte ne mette hors service votre serveur web.

sudo nginx -t

Si la configuration est correcte, vous verrez un message de succès.

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

Si vous voyez des erreurs, rouvrez le fichier de configuration et vérifiez attentivement les fautes de frappe ou les points-virgules manquants.

Vous avez maintenant configuré avec succès Nginx pour servir du contenu via HTTPS. L'étape suivante consiste à appliquer ces modifications en redémarrant le service et en testant la connexion.

Activer et tester la configuration HTTPS avec curl

Dans cette étape, vous allez appliquer la nouvelle configuration Nginx et confirmer que votre serveur web sert correctement du contenu via HTTPS. Bien que vous ayez modifié le fichier de configuration sur le disque, le processus Nginx en cours utilise toujours l'ancienne configuration. Vous devez redémarrer le service pour que les modifications prennent effet.

Pour appliquer la nouvelle configuration, redémarrez le service Nginx en utilisant systemctl.

sudo systemctl restart nginx

Cette commande ne produit aucune sortie si elle réussit. Nginx écoutera désormais sur le port 443 et sera prêt à gérer les requêtes HTTPS en utilisant le certificat et la clé que vous avez fournis.

Maintenant, testons le point de terminaison HTTPS. Nous utiliserons curl, un outil en ligne de commande pour transférer des données avec des URLs. Nous allons essayer de récupérer la page d'accueil de notre serveur en utilisant le protocole https://.

Lorsque vous vous connectez à un serveur via HTTPS, votre client (dans ce cas, curl) vérifie si le certificat du serveur est signé par une Autorité de Certification (CA) de confiance. Étant donné que nous avons créé un certificat auto-signé, il n'est pas approuvé par défaut, et curl refusera de se connecter, affichant une erreur de validation de certificat.

Pour contourner cela pour notre test, nous utilisons l'option -k ou --insecure. Cette option indique à curl d'ignorer la validation du certificat. Ceci n'est pas sécurisé et ne doit pas être utilisé en production, mais c'est nécessaire pour tester un certificat auto-signé dans un environnement de laboratoire.

Exécutez la commande suivante pour tester votre serveur HTTPS :

curl -k https://localhost

Si votre configuration est correcte, curl se connectera avec succès au serveur et affichera le contenu HTML de la page d'accueil par défaut de Nginx.

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Recevoir cette sortie HTML confirme que votre serveur Nginx est correctement configuré et sert du contenu via une connexion HTTPS cryptée. Dans la dernière étape, vous apprendrez comment inspecter le certificat que le serveur présente.

Inspecter le certificat SSL du serveur avec OpenSSL

Dans cette dernière étape, vous allez examiner les détails du certificat numérique que votre serveur Nginx présente aux clients. C'est une compétence essentielle pour le dépannage des problèmes TLS/HTTPS et la vérification de l'identité d'un serveur. Vous utiliserez à nouveau l'outil openssl, mais cette fois en tant que client pour vous connecter à votre propre serveur et inspecter le certificat qu'il fournit.

Nous utiliserons une combinaison de deux commandes openssl reliées par un pipe (|).

  • openssl s_client -connect localhost:443: Cette commande agit comme un client SSL/TLS générique et se connecte au serveur et au port spécifiés. Elle affichera le certificat du serveur ainsi que les détails de la session.
  • openssl x509 -text -noout: Cette commande est utilisée pour analyser et afficher le contenu d'un certificat X.509 dans un format lisible par l'homme.

Nous allons rediriger la sortie de s_client directement vers x509 pour analyser le certificat à la volée. Le echo | au début empêche s_client d'attendre une saisie utilisateur, et 2>/dev/null masque les messages d'état de connexion. Nous enregistrerons la sortie dans un fichier pour plus de clarté.

Exécutez la commande suivante pour vous connecter à votre serveur, extraire le certificat, l'analyser et enregistrer les détails dans un fichier nommé /tmp/server_certificate_details.txt.

echo | openssl s_client -connect localhost:443 2> /dev/null | openssl x509 -text -noout > /tmp/server_certificate_details.txt

Maintenant, affichez le contenu du fichier que vous venez de créer pour voir les détails du certificat.

cat /tmp/server_certificate_details.txt

Vous verrez une ventilation détaillée des propriétés du certificat.

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = State, L = City, O = LabOrg, OU = IT, CN = localhost
        Validity
            Not Before: Oct 30 09:00:00 2023 GMT
            Not After : Oct 29 09:00:00 2024 GMT
        Subject: C = US, ST = State, L = City, O = LabOrg, OU = IT, CN = localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:
                    ...
                Exponent: 65537 (0x10001)
...

Prenez un moment pour examiner la sortie. Remarquez ces champs clés :

  • Issuer (Émetteur) : L'entité qui a signé le certificat.
  • Subject (Sujet) : L'entité à laquelle le certificat a été délivré.
  • CN (Common Name) (Nom Commun) : Le domaine spécifique pour lequel le certificat est émis (localhost).

Comme il s'agit d'un certificat auto-signé, les champs Issuer et Subject sont identiques. C'est la caractéristique distinctive d'un certificat auto-signé. Vous pouvez également voir la période de validité et les détails de la clé publique.

Félicitations ! Vous avez configuré avec succès un serveur web Nginx avec un certificat SSL auto-signé, l'avez configuré pour HTTPS, testé la connexion et inspecté les détails du certificat. Vous avez maintenant une compréhension fondamentale des composants impliqués dans la sécurisation du trafic web avec TLS/HTTPS.

Résumé

Dans ce laboratoire, vous avez appris le processus de bout en bout de mise en œuvre de HTTPS sur un serveur web Nginx dans un environnement Linux en utilisant un certificat auto-signé. Vous avez commencé par mettre en place les fondations, ce qui a impliqué la mise à jour de la liste des paquets du système et l'installation du serveur web Nginx à l'aide du gestionnaire de paquets apt. Le cœur du laboratoire s'est concentré sur la sécurité, où vous avez utilisé la boîte à outils OpenSSL pour générer une clé privée et un certificat SSL auto-signé correspondant, qui sont les composants essentiels pour activer les connexions cryptées.

Une fois le certificat créé, vous avez procédé à la configuration du serveur Nginx. Cela a impliqué la modification de ses fichiers de configuration pour créer un bloc serveur qui écoute sur le port 443 pour le trafic HTTPS et le dirige vers les chemins de votre nouveau certificat et de votre clé privée. Pour finaliser le processus, vous avez activé la nouvelle configuration et effectué des étapes de vérification cruciales. Vous avez utilisé la commande curl pour tester la connexion HTTPS depuis la ligne de commande et confirmé que le serveur répondait de manière sécurisée. Enfin, vous avez utilisé OpenSSL comme outil client pour inspecter le certificat du serveur, validant ainsi que le bon certificat était servi.