Sécurisez Nginx avec Let’s Encrypt sur CentOS 8

Let’s Encrypt est une autorité de certification ouverte, automatisée et gratuite développée par 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.

Dans ce didacticiel, nous allons fournir des instructions étape par étape sur la façon d’installer un certificat SSL gratuit Let’s Encrypt sur CentOS 8 exécutant Nginx en tant que serveur Web. Nous montrerons également comment configurer Nginx pour utiliser le certificat SSL et activer HTTP / 2.

Conditions préalables #

Avant de continuer, assurez-vous d’avoir satisfait aux conditions préalables suivantes:

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

Installation de Certbot #

Certbot est un outil de ligne de commande gratuit qui simplifie le processus d’obtention et de renouvellement des certificats SSL de Let’s Encrypt à partir de HTTPS et l’activation automatique sur votre serveur.

Le package certbot n’est pas inclus dans les référentiels CentOS 8 standard, mais il peut être téléchargé à partir du site Web du fournisseur.

Exécutez la commande wget suivante en tant qu’utilisateur root ou sudo pour télécharger le script certbot sur le/usr/local/binannuaire:

sudo wget -P /usr/local/bin https://dl.eff.org/certbot-auto

Une fois le téléchargement terminé, rendez le fichier exécutable:

sudo chmod +x /usr/local/bin/certbot-auto

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 nouvel ensemble de paramètres DH à 2048 bits en tapant la commande suivante:

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

Si vous le souhaitez, vous pouvez modifier la 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-challengeannuaire. Le serveur Let’s Encrypt envoie des requêtes HTTP au fichier temporaire pour valider que le domaine demandé est résolu sur le serveur sur lequel s’exécute certbot.

Pour simplifier, nous allons mapper toutes les requêtes HTTP pour.well-known/acme-challengedans 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 nginx /var/lib/letsencryptsudo chmod g+s /var/lib/letsencrypt

Pour éviter la duplication de code, créez les deux extraits suivants qui seront inclus dans tous les fichiers de blocage du serveur Nginx:

sudo mkdir /etc/nginx/snippets
/etc/nginx/snippets/letsencrypt.conf
location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/lib/letsencrypt/;
  default_type "text/plain";
  try_files $uri =404;
}
/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 off;

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=63072000" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;

L’extrait ci-dessus inclut les déchiqueteurs recommandés par Mozilla, active l’agrafage OCSP, la sécurité de transport stricte HTTP (HSTS) et applique peu d’en-têtes HTTP axés sur la sécurité.

Une fois les extraits créés, ouvrez le bloc du serveur de domaine et incluez leletsencrypt.confextrait, comme illustré ci-dessous:

/etc/nginx/conf.d/example.com.conf
server {
  listen 80;
  server_name example.com www.example.com;

  include snippets/letsencrypt.conf;
}

Rechargez la configuration Nginx pour que les modifications prennent effet:

sudo systemctl reload nginx

Exécutez l’outil certbot avec le plugin webroot pour obtenir les fichiers de certificat SSL pour votre domaine:

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

Si c’est la première fois que vous invoquezcertbot, l’outil installe les dépendances manquantes.

Une fois le certificat SSL obtenu, 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-03-12. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - 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 votre bloc de serveur de domaine comme suit:

/etc/nginx/conf.d/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 redirige la version www vers la version non www.

Enfin, rechargez le service Nginx pour que les modifications prennent effet:

sudo systemctl reload nginx

Maintenant, ouvrez votre site Web en utilisanthttps://, et vous remarquerez une icône de cadenas vert.

Si vous testez votre domaine à l’aide du test du serveur SSL Labs, vous obtiendrez unA+grade, comme indiqué dans l’image ci-dessous:

Renouvellement automatique Cryptons le certificat SSL #

Les certificats de Let’s Encrypt sont valides pendant 90 jours. Pour renouveler automatiquement les certificats avant leur expiration, créez un cronjob qui s’exécutera deux fois par jour et renouvellera automatiquement tout certificat 30 jours avant l’expiration.

Utilisez lecrontabcommande pour créer un nouveau cronjob:

sudo crontab -e

Collez la ligne suivante:

0 */12 * * * root test -x /usr/local/bin/certbot-auto -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && /usr/local/bin/certbot-auto -q renew --renew-hook "systemctl reload nginx"

Enregistrez et fermez le fichier.

Pour tester le processus de renouvellement, vous pouvez utiliser la commande certbot suivie de la--dry-runcommutateur:

sudo ./certbot-auto renew --dry-run