Recherche de site Web

Comment sécuriser Nginx avec SSL et Let's Encrypt dans FreeBSD


Dans ce guide, nous verrons comment sécuriser le serveur Web Nginx dans FreeBSD avec les certificats TLS/SSL proposés par Let's Encrypt Certificate. Autorité. Nous vous montrerons également comment renouveler automatiquement les certificats Lets' Encrypt avant la date d'expiration.

TLS, acronyme de Transport Layer Security, est un protocole qui fonctionne sous le protocole HTTP et utilise des certificats et des clés afin d'encapsuler les paquets et chiffrer les données échangées entre un serveur et un client, ou dans ce cas entre le serveur web Nginx et le navigateur du client, afin de sécuriser la connexion, afin qu'un tiers, qui pourrait intercepter le trafic, ne puisse pas décrypter la transmission.

Lire aussi : Installez Let's Encrypt pour Apache sur FreeBSD

Le processus d'obtention d'un certificat Let's Encrypt gratuit dans FreeBSD peut être grandement simplifié en installant l'utilitaire client certboot, qui est le client officiel Let's Encrypt utilisé. pour générer et télécharger des certificats.

Exigences

  1. Installer la pile FBEMP (Nginx, MariaDB et PHP) dans FreeBSD

Étape 1 : Configurer Nginx TLS/SSL

1. Par défaut, la configuration du serveur TLS/SSL n'est pas activée dans FreeBSD car les instructions de blocage du serveur TLS sont commentés dans le fichier de configuration par défaut de Nginx.

Afin d'activer le serveur TLS dans Nginx, ouvrez le fichier de configuration nginx.conf, recherchez la ligne qui définit le démarrage de SSL et mettez à jour le bloc entier pour qu'il ressemble à l'exemple ci-dessous.

nano /usr/local/etc/nginx/nginx.conf

Extrait du bloc HTTPS Nginx :

server {
       listen 443 ssl  default_server;
       server_name  www.yourdomain.com;
	
	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;
	error_page   500 502 503 504  /50x.html;
        
	location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
	
	location / {
	    root   /usr/local/www/nginx;
       	    index  index.html index.htm;
	    try_files $uri $uri/ /index.php?$args;
				}

	ssl_certificate "/usr/local/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
	ssl_certificate_key "/usr/local/etc/letsencrypt/live/www.yourdomain.com/privkey.pem";
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_dhparam /usr/local/etc/nginx/dhparam.pem;
	ssl_session_cache shared:SSL:1m;
	ssl_session_timeout 10m;
	ssl_ciphers HIGH:!aNULL:!MD5;
	ssl_prefer_server_ciphers  on;

	# Use gzip compression
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_buffers 16 8k;
gzip_http_version 1.0;

	# Set a variable to work around the lack of nested conditionals
	
	set $cache_uri $request_uri;
	
	location ~ /.well-known {
	allow all;
		}
    


        location ~ \.php$ {
        root	/usr/local/www/nginx;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        #fastcgi_param  SCRIPT_FILENAME /scripts$fastcgi_script_name;
        fastcgi_param SCRIPT_FILENAME $request_filename;    
		include        fastcgi_params;
        }	
    }

Le bloc ci-dessus, en plus du bloc SSL, contient également des instructions pour activer la compression gzip et FastCGI Process Manager, utilisé pour transmettre du code PHP à PHP-FPM< passerelle afin d'exécuter des applications Web dynamiques.

Après avoir ajouté le code ci-dessus au fichier de configuration principal de Nginx, ne redémarrez pas le démon et n'appliquez pas les paramètres avant d'installer et d'obtenir un certificat Let's Encrypt pour votre domaine.

Étape 2 : Installer le client Certbot dans FreeBSD

2. Le processus d'installation de l'utilitaire client Let's Encrypt certbot dans FreeBSD implique de télécharger le code source de py-certbot et de le compiler localement, en émettant les commandes ci-dessous.

cd /usr/ports/security/py-certbot
make install clean

3. La compilation de l'utilitaire py-certbot prend beaucoup de temps par rapport à l'installation d'un package binaire standard. Pendant ce temps, une série de dépendances doivent être téléchargées et compilées localement dans FreeBSD.

En outre, une série d'invites apparaîtra sur votre écran, vous demandant de sélectionner les packages qui seront utilisés au moment de la compilation pour chaque dépendance. Sur le premier écran, sélectionnez les outils suivants, en appuyant sur la touche [espace], pour compiler la dépendance python27, comme illustré dans l'image ci-dessous.

  • IPV6
  • LIBFFI
  • NLS
  • PYMALLOC
  • FILS
  • UCS4 pour la prise en charge d'Unicode

4. Ensuite, sélectionnez DOCS et THREADS pour la dépendance gettext-tools et appuyez sur OK pour continuer comme indiqué dans l'image ci-dessous.

5. Sur l'écran suivant, laissez l'option TESTS désactivée pour libffi-3.2.1 et appuyez sur OK pour déplacer plus loin.

6. Ensuite, appuyez sur Espace pour sélectionner DOCS pour la dépendance py27-enum34, ce qui installera la documentation correspondante. et appuyez sur OK pour continuer, comme illustré dans la capture d'écran ci-dessous.

7. Enfin, choisissez d'installer des exemples d'exemples pour la dépendance py27-openssl en appuyant sur la touche [espace] et en appuyant sur OK . pour terminer le processus de compilation et d'installation du client py-certbot.

8. Une fois le processus de compilation et d'installation de l'utilitaire py-certbot terminé, exécutez la commande ci-dessous afin de mettre à niveau l'outil avec la dernière version du package, comme illustré dans le ci-dessous les captures d'écran.

pkg install py27-certbot

9. Afin d'éviter certains problèmes, cela peut survenir lors de l'obtention d'un certificat Let's Encrypt gratuit, l'erreur la plus courante étant « pkg_resources.DistributionNotFound » , assurez-vous que les deux dépendances suivantes sont également présentes dans votre système : py27-salt et py27-acme.

pkg install py27-salt
pkg install py27-acme

Étape 3 : Installez le certificat Let's Encrypt pour Nginx sur FreeBSD

10. Afin d'obtenir un certificat autonome Let's Encrypt pour votre domaine, exécutez la commande suivante et fournissez votre nom de domaine et tous les sous-domaines pour lesquels vous souhaitez obtenir des certificats en impliquant le -d. drapeau.

certbot certonly --standalone -d yourdomain.com -d www.yourdomain.com

11. Lors de la génération du certificat, il vous sera demandé de saisir votre adresse e-mail et d'accepter les conditions d'utilisation de Let's Encrypt. Tapez a sur le clavier pour accepter et continuer. Il vous sera également demandé si vous souhaitez partager votre adresse e-mail avec les partenaires de Let's Encrypt.

Si vous ne souhaitez pas partager votre adresse e-mail, tapez simplement no mot dans l'invite et appuyez sur la touche [enter] pour continuer. Une fois les certificats de votre domaine obtenus avec succès, vous recevrez des notes importantes qui vous informeront où les certificats sont stockés dans votre système et quand ils expirent.

12. Dans le cas où vous souhaitez obtenir un certificat Let's Encrypt à l'aide du plugin « webroot » en ajoutant le répertoire webroot du serveur Nginx pour votre domaine , exécutez la commande suivante avec les indicateurs --webroot et -w. Par défaut, si vous n'avez pas modifié le chemin de la racine Web de Nginx, il doit se trouver dans le chemin système /usr/local/www/nginx/.

certbot certonly --webroot -w /usr/local/www/nginx/ -d yourdomain.com -d www.yourdomain.com

Comme dans la procédure --strandalone pour l'obtention d'un certificat, la procédure --webroot vous demandera également de fournir une adresse email pour le renouvellement du certificat et les avis de sécurité, d'appuyer sur a pour accepter les termes et conditions de Let's Encrypt et non ou oui pour partager ou non l'adresse e-mail des partenaires de Let's Encrypt, comme illustré dans l'exemple ci-dessous.

Sachez que le client certbot peut détecter une fausse adresse e-mail et ne vous permettra pas de continuer à générer un certificat tant que vous n'aurez pas fourni une véritable adresse e-mail.

Échantillon de Cerbot :
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):[email   #A fake email address will be detected
There seem to be problems with that address. Enter email address (used for
urgent renewal and security notices)  If you really want to skip this, you can
run the client with --register-unsafely-without-email but make sure you then
backup your account key from /etc/letsencrypt/accounts   (Enter 'c' to cancel):[email 

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: a ------------------------------------------------------------------------------- Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about EFF and our work to encrypt the web, protect its users and defend digital rights. ------------------------------------------------------------------------------- (Y)es/(N)o: n Obtaining a new certificate Performing the following challenges: http-01 challenge for www.domain.com Using the webroot path /usr/local/www/nginx/ for all unmatched domains. Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /usr/local/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem. Your cert will expire on 2017-12-28. 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 /usr/local/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

Étape 4 : Mettre à jour les certificats Nginx TLS

13. L'emplacement des certificats et des clés Let's Encrypt obtenus dans FreeBSD est le chemin système /usr/local/etc/letsencrypt/live/www.yourdomain.com/. Exécutez la commande ls afin d'afficher les composants de votre certificat Let's Encrypt : le fichier chaîne, le fichier fullchain, la clé privée et le fichier de certificat, comme illustré dans l'exemple suivant.

ls /usr/local/etc/letsencrypt/live/www.yourdomain.com/

14. Afin d'installer les certificats Let's Encrypt pour votre domaine sur le serveur Web Nginx, ouvrez le fichier de configuration principal de Nginx ou le fichier de configuration du serveur Nginx TLS, s'il s'agit d'un fichier distinct, et modifiez les lignes ci-dessous. pour refléter le chemin d'accès aux certificats émis par Let's Encrypt, comme illustré ci-dessous.

nano /usr/local/etc/nginx/nginx.conf

Mettez à jour les lignes suivantes pour qu'elles ressemblent à cet exemple :

ssl_certificate "/usr/local/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
	ssl_certificate_key "/usr/local/etc/letsencrypt/live/www.yourdomain.com/privkey.pem";

15. De plus, si la ligne ssl_dhparam est présente dans la configuration Nginx SSL, vous devez générer un nouveau bit 2048 Touche Diffie–Hellman avec la commande suivante :

openssl dhparam –out /usr/local/etc/nginx/dhparam.pem 2048 

16. Enfin, afin d'activer la configuration Nginx TLS, vérifiez d'abord la configuration globale de Nginx pour d'éventuelles erreurs de syntaxe, puis redémarrez le service Nginx pour appliquer la configuration SSL en exécutant les commandes suivantes.

nginx -t
service nginx restart

17. Confirmez si le démon Nginx se lie au port 443 en émettant les commandes suivantes qui peuvent répertorier toutes les sockets réseau ouvertes dans le système en état d'écoute.

netstat -an -p tcp| grep LISTEN
sockstat -4 

18. Vous pouvez également visiter votre adresse de domaine via le protocole HTTPS en ouvrant un navigateur et en saisissant l'adresse suivante afin de confirmer que les certificats Let's Encrypt fonctionnent comme prévu. Étant donné que vous utilisez des certificats générés par une autorité de certification valide, aucune erreur ne devrait s'afficher dans le navigateur.

https://www.yourdomain.com

19. L'utilitaire Openssl peut également vous aider à trouver des informations sur un certificat obtenu auprès de Let's Encrypt CA, en exécutant la commande avec les options suivantes.

openssl s_client -connect www.yourdomain.com:443

Si vous souhaitez forcer Nginx à diriger toutes les requêtes http vers https reçues pour votre domaine sur le port 80 vers HTTPS, ouvrez le fichier de configuration Nginx, localisez la directive serveur pour le port 80. et ajoutez la ligne ci-dessous après l'instruction server_name comme illustré dans l'exemple ci-dessous.

rewrite ^(.*) https://www.yourdomain.com$1 permanent;

20. La configuration du renouvellement automatique des certificats émis par l'autorité Let's Encrypt avant leur expiration peut être effectuée en planifiant une tâche cron à exécuter une fois par jour en exécutant la commande suivante.

crontab -e

Tâche périodique pour renouveler le certificat.

0 0 * * * certbot renew >> /var/log/letsencrypt.log

C'est tout! Nginx peut désormais proposer des applications Web sécurisées à vos visiteurs à l'aide des certificats gratuits Let's Encrypt.