GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Sécurisez Nginx avec Lets Encrypt sur Ubuntu 20.04

Let's Encrypt est une autorité de certification gratuite, automatisée et ouverte développée par l'Internet Security Research Group (ISRG) qui fournit des certificats SSL gratuits.

Les certificats émis par Let's Encrypt sont approuvés par tous les principaux navigateurs et valides pendant 90 jours à compter de la date d'émission.

Ce tutoriel explique comment installer un certificat SSL Let's Encrypt gratuit sur Ubuntu 20.04, en exécutant Nginx en tant que serveur Web. Nous montrerons également comment configurer Nginx pour utiliser le certificat SSL et activer HTTP/2.

Prérequis #

Avant de continuer, assurez-vous que vous avez rempli les conditions préalables suivantes :

  • Vous disposez d'un nom de domaine pointant vers votre adresse IP publique. Nous utiliserons example.com .
  • Nginx est installé sur votre serveur CentOS.
  • Votre pare-feu est configuré pour accepter les connexions sur les ports 80 et 443.

Installation de Certbot #

Nous utiliserons certbot pour obtenir et renouveler les certificats.

Certbot est un outil complet et facile à utiliser qui automatise les tâches d'obtention et de renouvellement des certificats SSL Let's Encrypt et de configuration des serveurs Web pour utiliser les certificats.

Le package certbot est inclus dans les référentiels Ubuntu par défaut. Pour l'installer, exécutez les commandes suivantes :

sudo apt updatesudo apt install certbot

Génération du groupe Strong Dh (Diffie-Hellman) #

L'échange de clés Diffie-Hellman (DH) est une méthode d'échange sécurisé de clés cryptographiques sur un canal de communication non sécurisé.

Générez un nouveau jeu de paramètres DH 2048 bits en tapant la commande suivante :

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Vous pouvez également utiliser une longueur de clé jusqu'à 4096 bits, mais la génération peut prendre plus de 30 minutes, selon l'entropie du système.

Obtention d'un certificat SSL Let's Encrypt #

Pour obtenir un certificat SSL pour le domaine, nous allons utiliser le plugin Webroot qui fonctionne en créant un fichier temporaire pour valider le domaine demandé dans le ${webroot-path}/.well-known/acme-challenge annuaire. Le serveur Let's Encrypt envoie des requêtes HTTP au fichier temporaire pour vérifier que le domaine demandé correspond au serveur sur lequel le certbot s'exécute.

Pour simplifier, nous allons mapper toutes les requêtes HTTP pour .well-known/acme-challenge dans un seul répertoire, /var/lib/letsencrypt .

Les commandes suivantes créeront le répertoire et le rendront accessible en écriture pour le serveur Nginx :

sudo mkdir -p /var/lib/letsencrypt/.well-knownsudo chgrp www-data /var/lib/letsencryptsudo chmod g+s /var/lib/letsencrypt

Pour éviter la duplication de code, nous allons créer deux extraits et les inclure dans tous les fichiers de bloc du serveur Nginx.

Ouvrez votre éditeur de texte et créez le premier extrait, letsencrypt.conf :

sudo nano /etc/nginx/snippets/letsencrypt.conf
/etc/nginx/snippets/letsencrypt.conf
location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/lib/letsencrypt/;
  default_type "text/plain";
  try_files $uri =404;
}

Ensuite, créez le deuxième extrait, ssl.conf , qui inclut les chippers recommandés par Mozilla, active l'agrafage OCSP, HTTP Strict Transport Security (HSTS) et applique quelques en-têtes HTTP axés sur la sécurité.

sudo nano /etc/nginx/snippets/ssl.conf
/etc/nginx/snippets/ssl.conf
ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;

Une fois les extraits créés, ouvrez le fichier de blocage du serveur de domaine et incluez le letsencrypt.conf extrait comme indiqué ci-dessous :

sudo nano /etc/nginx/sites-available/example.com.conf
/etc/nginx/sites-available/example.com.conf
server {
  listen 80;
  server_name example.com www.example.com;

  include snippets/letsencrypt.conf;
}

Pour activer le nouveau bloc de serveur, créez un lien symbolique du fichier vers le sites-enabled répertoire :

sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/

Redémarrez le service Nginx pour que les modifications prennent effet :

sudo systemctl restart nginx

Vous pouvez maintenant exécuter Certbot avec le plugin webroot et obtenir les fichiers de certificat SSL en émettant :

sudo certbot certonly --agree-tos --email [email protected] --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com

Si le certificat SSL est obtenu avec succès, certbot imprimera le message suivant :

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2020-10-18. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Maintenant que vous disposez des fichiers de certificat, vous pouvez modifier le bloc de votre serveur de domaine comme suit :

sudo nano /etc/nginx/sites-available/example.com.conf
/etc/nginx/sites-available/example.com.conf
server {
    listen 80;
    server_name www.example.com example.com;

    include snippets/letsencrypt.conf;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    # . . . other code
}

Avec la configuration ci-dessus, nous forçons HTTPS et la redirection de la version www vers la version non www.

Rechargez le service Nginx pour que les modifications prennent effet :

sudo systemctl reload nginx

Pour vérifier que le certificat SSL est installé avec succès, ouvrez votre site Web en utilisant https:// , et vous remarquerez une icône de cadenas vert.

Si vous testez votre domaine à l'aide du test de serveur SSL Labs, vous obtiendrez un A+ note, comme indiqué dans l'image ci-dessous :

Certificat SSL à renouvellement automatique #

Les certificats de Let’s Encrypt sont valides pendant 90 jours. Pour renouveler automatiquement les certificats avant leur expiration, le package certbot crée un cronjob et un timer systemd. Le minuteur renouvellera automatiquement les certificats 30 jours avant son expiration.

Lorsque le certificat est renouvelé, le service nginx doit être rechargé. Ouvrez le fichier /etc/letsencrypt/cli.ini et ajoutez la ligne suivante :

sudo nano /etc/letsencrypt/cli.ini
/etc/cron.d/certbot
deploy-hook = systemctl reload nginx

Pour tester le processus de renouvellement, exécutez le certbot --dry-run commande :

sudo certbot renew --dry-run

S'il n'y a pas d'erreurs, cela signifie que le processus de renouvellement a réussi.


Ubuntu
  1. Comment sécuriser Nginx avec Lets Encrypt sur Ubuntu 20.04 / 18.04

  2. Sécurisez Nginx avec Lets Encrypt sur Ubuntu 18.04

  3. Sécurisez Nginx avec Lets Encrypt sur Ubuntu 16.04

  4. Sécurisez Apache avec Lets Encrypt sur Ubuntu 18.04

  5. Comment sécuriser Nginx avec Let's Encrypt sur Ubuntu 20.04

Comment installer NodeBB Forum avec Nginx et Lets Encrypt SSL sur Ubuntu 20.04 LTS

Comment installer Moodle avec Nginx et Lets Encrypt SSL sur Ubuntu 20.04

Comment configurer le certificat SSL Let's Encrypt avec Nginx sur Ubuntu 18.04 et Ubuntu 16.04

Comment installer Nginx avec Let's Encrypt SSL sur Ubuntu 20.04 LTS

Sécurisez Nginx avec le certificat SSL Let's Encrypt sur Ubuntu 18.04

Comment sécuriser Nginx avec Let's Encrypt sur Ubuntu 20.04