Android

Nginx sécurisé avec Let's Encrypt sur Debian 10 Linux

Mettre en place un serveur Web (35/28) : Nginx : Se protéger des attaques Flood

Mettre en place un serveur Web (35/28) : Nginx : Se protéger des attaques Flood

Table des matières:

Anonim

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.

Ce tutoriel montre comment installer un certificat SSL Let's Encrypt gratuit sur Debian 10, Buster 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

Assurez-vous que les conditions préalables suivantes sont remplies avant de poursuivre avec le guide:

  • Connecté en tant qu'utilisateur root ou utilisateur avec les privilèges sudo. Le domaine pour lequel vous souhaitez obtenir le certificat SSL doit pointer vers l'adresse IP de votre serveur public. Nous utiliserons example.com .Nginx installé.

Installation de Certbot

Nous utiliserons l'outil 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 la configuration des serveurs Web pour utiliser les certificats.

Le paquet certbot est inclus dans les référentiels Debian par défaut. Exécutez les commandes suivantes pour installer certbot:

sudo apt update sudo apt install certbot

Génération du groupe 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é.

Nous allons générer un nouvel ensemble de paramètres DH à 2048 bits pour renforcer la sécurité:

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

Vous pouvez également modifier la taille jusqu'à 4096 bits, mais la génération peut prendre plus de 30 minutes en fonction de 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. Il fonctionne en créant un fichier temporaire pour valider le domaine demandé dans le ${webroot-path}/.well-known/acme-challenge . 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.

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

Exécutez les commandes suivantes pour créer le répertoire et le rendre accessible en écriture pour le serveur Nginx:

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

Pour éviter la duplication de code, nous créerons deux extraits qui seront inclus dans tous les fichiers de blocage 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; }

Le deuxième extrait ssl.conf 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é.

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:50m; 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;

Une fois cela fait, ouvrez le fichier de blocage du serveur de domaine et incluez l'extrait letsencrypt.conf comme indiqué ci-dessous:

sudo nano /etc/nginx/sites-available/example.com /etc/nginx/sites-available/example.com

server { listen 80; server_name example.com www.example.com; include snippets/letsencrypt.conf; }

Créez un lien symbolique vers l'annuaire sites-enabled avec les sites-enabled pour activer le bloc de serveur de domaine:

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

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

sudo systemctl restart nginx

Vous êtes maintenant prêt à obtenir les fichiers de certificat SSL en exécutant la commande suivante:

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, le message suivant sera imprimé sur votre terminal:

IMPORTANT NOTES: 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-02-22. 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" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF:

Modifiez le bloc du serveur de domaine et incluez les fichiers de certificat SSL comme suit:

sudo nano /etc/nginx/sites-available/example.com /etc/nginx/sites-available/example.com

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 }

La configuration ci-dessus indique à Nginx de rediriger de HTTP vers HTTPS et de www vers une version non www.

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

sudo systemctl restart nginx

Ouvrez votre site Web à l'aide de https:// et vous remarquerez une icône de verrouillage verte.

Renouvellement automatique du certificat SSL Let's Encrypt

Les certificats de Let's Encrypt sont valables 90 jours. Pour renouveler automatiquement les certificats avant leur expiration, le package certbot crée un cronjob qui s'exécute deux fois par jour et renouvelle automatiquement tout certificat 30 jours avant son expiration.

Lors du renouvellement, le service nginx doit être rechargé pour que le serveur charge le certificat. Ajoutez --renew-hook "systemctl reload nginx" au fichier /etc/cron.d/certbot pour qu'il ressemble à ceci:

sudo nano /etc/cron.d/certbot /etc/cron.d/certbot

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

Testez le processus de renouvellement automatique, en exécutant cette commande:

sudo certbot renew --dry-run

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

Conclusion

Avoir un certificat SSL est un must de nos jours. Il sécurise votre site Web, augmente la position de classement SERP et vous permet d'activer HTTP / 2 sur votre serveur Web.

Dans ce didacticiel, nous vous avons montré comment générer et renouveler des certificats SSL à l'aide du script certbot. Nous vous avons également montré comment configurer Nginx pour utiliser les certificats.

Pour en savoir plus sur Certbot, consultez la documentation Certbot.

nginx debian chiffrons certbot ssl