Recherche de site Web

Comment créer un certificat SSL auto-signé pour Nginx dans Ubuntu


Introduction

TLS, ou transport layer security, et son prédécesseur SSL, qui signifie Secure Sockets Layer, sont des protocoles Web utilisés pour protéger et chiffrer le trafic sur un réseau informatique.

Avec TLS/SSL, les serveurs peuvent envoyer du trafic en toute sécurité entre le serveur et les clients sans possibilité que les messages soient interceptés par des tiers. Le système de certificat aide également les utilisateurs à vérifier l'identité des sites auxquels ils se connectent.

Dans ce guide, vous allez configurer un certificat SSL auto-signé à utiliser avec un serveur Web Nginx sur un serveur Ubuntu.

Remarque : Un certificat auto-signé chiffrera la communication entre votre serveur et tous les clients. Cependant, comme il n'est signé par aucune des autorités de certification de confiance incluses dans les navigateurs Web, les utilisateurs ne peuvent pas utiliser le certificat pour valider automatiquement l'identité de votre serveur.

Un certificat auto-signé peut être approprié si vous n'avez pas de nom de domaine associé à votre serveur et dans les cas où l'interface Web cryptée n'est pas accessible à l'utilisateur. Si vous avez un nom de domaine, dans de nombreux cas, il est préférable d'utiliser un certificat signé par une autorité de certification. Vous pouvez découvrir comment mettre en place un certificat de confiance gratuit avec le projet Let's Encrypt.

Comment créer un certificat SSL auto-signé pour Nginx dans Ubuntu

  1. Création du certificat TLS
  2. Configurer Nginx pour utiliser SSL
  3. Ajuster le pare-feu
  4. Activation des modifications dans Nginx
  5. Test du chiffrement
  6. Passer à une redirection permanente

Conditions préalables

Avant de commencer, vous devez avoir un utilisateur non root configuré avec les privilèges sudo et un pare-feu activé. Vous pouvez apprendre à configurer un tel compte utilisateur en suivant notre configuration initiale du serveur pour Ubuntu.

Vous devrez également installer le serveur Web Nginx. Suivez notre guide sur l'installation de Nginx sur Ubuntu. Assurez-vous de terminer l'étape 5 du didacticiel et de configurer un blocage de serveur, car cela sera nécessaire pour tester si Nginx est capable de chiffrer les connexions à l'aide de votre certificat auto-signé.

Si vous souhaitez installer une pile LEMP complète (Linux, Nginx, MySQL, PHP) sur votre serveur, vous pouvez suivre notre guide sur la configuration de LEMP sur Ubuntu au lieu du guide d'installation autonome de Nginx.

Étape 1 — Création du certificat TLS

TLS/SSL fonctionne par une combinaison d'un certificat public et d'une clé privée. La clé SSL est gardée secrète sur le serveur et crypte le contenu envoyé aux clients. Le certificat SSL est partagé publiquement avec toute personne demandant le contenu. Il peut être utilisé pour décrypter le contenu signé par la clé SSL associée.

Vous pouvez créer une paire clé et certificat auto-signés avec OpenSSL en une seule commande :

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

Voici un aperçu de ce que fait chaque partie de cette commande :

  • sudo : La commande sudo permet aux membres du groupe sudo d'élever temporairement leurs privilèges à ceux d'un autre utilisateur (le superutilisateur ou utilisateur root, par défaut). Ceci est nécessaire dans ce cas puisque nous créons le certificat et la paire de clés dans le répertoire /etc/, auquel seul l'utilisateur root ou d'autres comptes privilégiés peuvent accéder. .
  • openssl : il s'agit de l'outil de ligne de commande de base pour créer et gérer les certificats, clés et autres fichiers OpenSSL.
  • req : Cette sous-commande spécifie que nous souhaitons utiliser la gestion des demandes de signature de certificat (CSR) X.509. Le « X.509 » est une norme d'infrastructure à clé publique à laquelle SSL et TLS adhèrent pour la gestion de ses clés et de ses certificats. Nous souhaitons créer un nouveau certificat X.509, nous utilisons donc cette sous-commande.
  • -x509 : cela modifie encore la sous-commande précédente en indiquant à l'utilitaire que nous voulons créer un certificat auto-signé au lieu de générer une demande de signature de certificat, comme cela se produirait normalement.
  • -nodes : cela indique à OpenSSL d'ignorer l'option permettant de sécuriser notre certificat avec une phrase secrète. Nous avons besoin que Nginx puisse lire le fichier, sans intervention de l'utilisateur, au démarrage du serveur. Une phrase secrète empêcherait que cela se produise car nous devrions la saisir après chaque redémarrage.
  • -days 365 : Cette option définit la durée pendant laquelle le certificat sera considéré comme valide. Nous l'avons fixé à un an ici.
  • -newkey rsa:2048 : Ceci précise que nous voulons générer un nouveau certificat et une nouvelle clé en même temps. Nous n'avons pas créé la clé requise pour signer le certificat lors d'une étape précédente, nous devons donc la créer avec le certificat. La partie rsa:2048 lui indique de créer une clé RSA d'une longueur de 2048 bits.
  • -keyout : Cette ligne indique à OpenSSL où placer le fichier de clé privée généré que nous créons.
  • -out : cela indique à OpenSSL où placer le certificat que nous créons.

Comme indiqué précédemment, ces options créeront à la fois un fichier de clé et un certificat. Après avoir exécuté cette commande, quelques questions vous seront posées sur votre serveur afin d'intégrer correctement les informations dans le certificat.

Remplissez les invites de manière appropriée. La ligne la plus importante est celle qui demande le Nom commun (par exemple le nom de domaine complet du serveur ou VOTRE nom). Vous devez saisir le nom de domaine associé à votre serveur ou, plus probablement, l'adresse IP publique de votre serveur.

L'intégralité des invites ressemblera à ce qui suit :

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com

Les deux fichiers que vous avez créés seront placés dans les sous-répertoires appropriés du répertoire /etc/ssl.

Lorsque vous utilisez OpenSSL, vous devez également créer un groupe Diffie-Hellman (DH) solide, qui est utilisé pour négocier le Perfect Forward Secrecy avec les clients.

Vous pouvez le faire en tapant :

sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096

Cela prendra un certain temps, mais une fois terminé, vous disposerez d'un groupe DH solide sur /etc/nginx/dhparam.pem qui sera utilisé lors de la configuration.

Étape 2 — Configuration de Nginx pour utiliser SSL

Maintenant que vos fichiers de clé et de certificat dans le répertoire /etc/ssl ont été créés, vous devrez modifier votre configuration Nginx pour en profiter.

Tout d’abord, vous allez créer un extrait de configuration avec les informations sur les emplacements de la clé SSL et du fichier de certificat. Ensuite, vous créerez un extrait de configuration avec un paramètre SSL fort qui pourra être utilisé avec n'importe quel certificat à l'avenir. Enfin, vous ajusterez les blocs de votre serveur Nginx à l'aide des deux extraits de configuration que vous avez créés afin que les requêtes SSL puissent être traitées de manière appropriée.

Cette méthode de configuration de Nginx vous permettra de conserver des blocs de serveur propres et de placer des segments de configuration communs dans des modules réutilisables.

Création d'un extrait de configuration pointant vers la clé et le certificat SSL

Tout d'abord, utilisez votre éditeur de texte préféré pour créer un nouvel extrait de configuration Nginx dans le répertoire /etc/nginx/snippets. L'exemple suivant utilise nano.

Pour bien distinguer l'objectif de ce fichier, nommez-le self-signed.conf :

sudo nano /etc/nginx/snippets/self-signed.conf

Dans ce fichier, vous devez définir la directive ssl_certificate sur votre fichier de certificat et la ssl_certificate_key sur la clé associée. Cela ressemblera à ceci :

ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

Lorsque vous avez ajouté ces lignes, enregistrez le fichier et quittez l'éditeur. Si vous avez utilisé nano pour modifier le fichier, vous pouvez le faire en appuyant sur CTRL + X, Y, puis ENTER.

Création d'un extrait de configuration avec des paramètres de chiffrement renforcés

Ensuite, vous créerez un autre extrait qui définira certains paramètres SSL. Cela configurera Nginx avec une suite de chiffrement SSL puissante et activera certaines fonctionnalités avancées qui aideront à sécuriser votre serveur.

Les paramètres que vous définissez peuvent être réutilisés dans les futures configurations Nginx, vous pouvez donc donner au fichier un nom générique :

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

Pour configurer Nginx SSL en toute sécurité, nous adapterons les recommandations de Cipherlist.eu. Cipherlist.eu est une ressource utile et compréhensible pour comprendre les paramètres de cryptage utilisés pour les logiciels populaires.

Remarque : ces paramètres suggérés par Cipherlist.eu offrent une sécurité renforcée. Parfois, cela se fait au prix d’une plus grande compatibilité client. Si vous avez besoin de prendre en charge des clients plus anciens, il existe une liste alternative accessible en cliquant sur le lien sur la page intitulée « Oui, donnez-moi une suite de chiffrement qui fonctionne avec les logiciels existants/anciens. " Si vous le souhaitez, vous pouvez remplacer cette liste par le contenu de l'exemple de bloc de code suivant.

Le choix de la configuration à utiliser dépendra en grande partie de ce que vous devez prendre en charge. Ils offriront tous deux une grande sécurité.

Pour vos besoins, copiez les paramètres fournis dans leur intégralité, mais vous devrez d'abord apporter quelques petites modifications.

Tout d’abord, ajoutez votre résolveur DNS préféré pour les requêtes en amont. Nous utiliserons ceux de Google (8.8.8.8 et 8.8.4.4) pour ce guide.

Deuxièmement, commentez la ligne qui définit l'en-tête strict de sécurité du transport. Avant de décommenter cette ligne, vous devriez prendre un moment pour vous renseigner sur HTTP Strict Transport Security, ou HSTS, et en particulier sur la fonctionnalité « préchargement ». Le préchargement HSTS offre une sécurité accrue, mais peut également avoir des conséquences négatives considérables s'il est activé accidentellement ou incorrectement.

Ajoutez ce qui suit dans votre fichier d'extrait de code ssl-params.conf :

ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem; 
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_session_timeout  10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

Étant donné que vous utilisez un certificat auto-signé, l'agrafage SSL ne sera pas utilisé. Nginx affichera un avertissement et désactivera l'agrafage pour notre certificat auto-signé, mais continuera alors à fonctionner correctement.

Enregistrez et fermez le fichier en appuyant sur CTRL + X puis Y et ENTER lorsque vous avez terminé.

Ajuster la configuration de Nginx pour utiliser SSL

Maintenant que vous disposez de vos extraits de code, vous pouvez ajuster la configuration de Nginx pour activer SSL.

Nous supposerons dans ce guide que vous utilisez un fichier de configuration de bloc de serveur personnalisé dans le répertoire /etc/nginx/sites-available. Ce guide suit également les conventions du didacticiel Nginx prérequis et utilise /etc/nginx/sites-available/your_domain pour cet exemple. Remplacez votre nom de fichier de configuration si nécessaire.

Avant de continuer, sauvegardez votre fichier de configuration actuel :

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

Maintenant, ouvrez le fichier de configuration pour effectuer les ajustements :

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

À l’intérieur, le blocage de votre serveur commence probablement de la même manière :

server {
        listen 80;
        listen [::]:80;

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

        server_name your_domain www.your_domain;

        location / {
                try_files $uri $uri/ =404;
        }
}

Votre fichier peut être dans un ordre différent, et au lieu des directives root et index, vous pouvez avoir des location, proxy_pass, ou d'autres instructions de configuration personnalisées. C'est très bien puisqu'il vous suffit de mettre à jour les directives listen et d'inclure les extraits SSL. Modifiez ensuite ce bloc de serveur existant pour desservir le trafic SSL sur le port 443, et créez un nouveau bloc de serveur pour répondre sur le port 80 et rediriger automatiquement le trafic vers le port 443 . .

Remarque : Utilisez une redirection 302 jusqu'à ce que vous ayez vérifié que tout fonctionne correctement. Ensuite, vous changerez cela en une redirection 301 permanente.

Dans votre fichier de configuration existant, mettez à jour les deux instructions listen pour utiliser le port 443 et ssl, puis incluez les deux fichiers d'extraits que vous avez créés aux étapes précédentes. :

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;

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

  location / {
                try_files $uri $uri/ =404;
        }
}

  

Ensuite, ajoutez un deuxième bloc serveur dans le fichier de configuration après le crochet fermant (>) du premier bloc :

server {
    listen 80;
    listen [::]:80;

    server_name your_domain.com www.your_domain.com;

    return 302 https://$server_name$request_uri;
}

Il s'agit d'une configuration simple qui écoute sur le port 80 et effectue la redirection vers HTTPS. Enregistrez et fermez le fichier en appuyant sur CTRL + X puis Y et ENTER lorsque vous avez terminé de le modifier.

Étape 3 — Ajustement du pare-feu

Si le pare-feu ufw est activé, comme recommandé par le guide des prérequis, vous devrez ajuster les paramètres pour autoriser le trafic SSL. Heureusement, Nginx enregistre quelques profils avec ufw lors de l'installation.

Vous pouvez consulter les profils disponibles en tapant :

sudo ufw app list

Une liste comme la suivante apparaîtra :

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Vous pouvez vérifier le paramètre actuel en tapant sudo ufw status :

sudo ufw status

Cela générera probablement la réponse suivante, ce qui signifie que seul le trafic HTTP est autorisé vers le serveur Web :

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Pour autoriser le trafic HTTPS, vous pouvez mettre à jour les autorisations pour le profil « Nginx Full », puis supprimer l'allocation de profil « Nginx HTTP » redondante :

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

Après avoir exécuté sudo ufw status, vous devriez recevoir le résultat suivant :

sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

Cette sortie confirme que les ajustements de votre pare-feu ont réussi et que vous êtes prêt à activer les modifications dans Nginx.

Étape 4 — Activation des modifications dans Nginx

Une fois les modifications et ajustements de votre pare-feu terminés, vous pouvez redémarrer Nginx pour mettre en œuvre les nouvelles modifications.

Vérifiez d’abord qu’il n’y a pas d’erreurs de syntaxe dans les fichiers. Vous pouvez le faire en tapant sudo nginx -t :

sudo nginx -t

Si tout réussit, vous obtiendrez un résultat qui dit ce qui suit :

nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Notez l'avertissement au début. Comme indiqué précédemment, ce paramètre particulier génère un avertissement puisque votre certificat auto-signé ne peut pas utiliser l'agrafage SSL. Ceci est normal et votre serveur peut toujours chiffrer correctement les connexions.

Si votre sortie correspond à notre exemple, votre fichier de configuration ne contient aucune erreur de syntaxe. Si tel est le cas, vous pouvez redémarrer Nginx en toute sécurité pour implémenter les modifications :

sudo systemctl restart nginx

Maintenant que le système a été redémarré avec les nouvelles modifications, vous pouvez procéder aux tests.

Étape 5 — Test du cryptage

Vous êtes maintenant prêt à tester votre serveur SSL.

Ouvrez votre navigateur Web et tapez https:// suivi du nom de domaine ou de l'adresse IP de votre serveur dans la barre d'adresse :

https://server_domain_or_IP

En fonction de votre navigateur, vous recevrez probablement un avertissement puisque le certificat que vous avez créé n'est pas signé par l'une des autorités de certification de confiance de votre navigateur :

Cet avertissement est attendu et normal. Nous ne nous intéressons qu’à l’aspect cryptage de notre certificat, pas à la validation par un tiers de l’authenticité de notre hébergeur. Cliquez sur « AVANCÉ » puis sur le lien fourni pour accéder à votre hébergeur :

À ce stade, vous devriez être redirigé vers votre site. Dans notre exemple, la barre d'adresse du navigateur affiche un cadenas surmonté d'un « x », ce qui signifie que le certificat ne peut pas être validé. Il crypte toujours votre connexion. Notez que cette icône peut différer selon votre navigateur.

Si vous avez configuré Nginx avec deux blocs de serveur, redirigeant automatiquement le contenu HTTP vers HTTPS, vous pouvez également vérifier si la redirection fonctionne correctement :

http://server_domain_or_IP

Si cela génère la même icône, cela signifie que votre redirection a fonctionné correctement.

Étape 6 — Passer à une redirection permanente

Si votre redirection a fonctionné correctement et que vous êtes sûr de vouloir autoriser uniquement le trafic chiffré, vous devez modifier la configuration de Nginx pour rendre la redirection permanente.

Ouvrez à nouveau le fichier de configuration de votre bloc serveur :

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

Recherchez le retour 302 et remplacez-le par retour 301 :

	return 301 https://$server_name$request_uri;

Enregistrez et fermez le fichier en appuyant sur CTRL + X puis Y et ENTER

Vérifiez votre configuration pour les erreurs de syntaxe :

sudo nginx -t

Lorsque vous êtes prêt, redémarrez Nginx pour rendre la redirection permanente :

sudo systemctl restart nginx

Après le redémarrage, les modifications seront mises en œuvre et votre redirection est désormais permanente.

Conclusion

Vous avez configuré votre serveur Nginx pour utiliser un cryptage fort pour les connexions client. Cela vous permettra de répondre aux demandes en toute sécurité et d’empêcher des tiers de lire votre trafic. Vous pouvez également choisir d'utiliser un certificat SSL auto-signé qui peut être obtenu auprès de Let's Encrypt, une autorité de certification qui installe des certificats TLS/SSL gratuits et active le HTTPS crypté sur les serveurs Web. Apprenez-en davantage grâce à notre didacticiel sur Comment sécuriser Nginx avec Let’s Encrypt sur Ubuntu.

Articles connexes: