Com protegir Nginx amb SSL i xifrem a FreeBSD


En aquesta guia parlarem de com protegir el servidor web Nginx a FreeBSD amb els certificats TLS/SSL oferts per Let's Encrypt Certificate Authority. També us mostrarem com renovar automàticament els certificats de Lets' Encrypt abans de la data de caducitat.

TLS, acrònim de Transport Layer Security, és un protocol que funciona sota el protocol HTTP i utilitza certificats i claus per encapsular els paquets i xifrar les dades intercanviades entre un servidor i un client, o en aquest cas entre el servidor web de Nginx i el client. navegador, per tal de garantir la connexió, de manera que un tercer, que pugui interceptar el trànsit, no pugui desxifrar la transmissió.

El procés d'obtenció d'un certificat de Let's Encrypt gratuït a FreeBSD es pot simplificar molt instal·lant la utilitat client certboot, que és el client oficial de Let's Encrypt utilitzat per generar i descarregar certificats.

  1. Instal·leu la pila FBEMP (Nginx, MariaDB i PHP) a FreeBSD

Pas 1: configureu Nginx TLS/SSL

1. Per defecte, la configuració del servidor TLS/SSL no està habilitada a FreeBSD perquè les declaracions de bloqueig del servidor TLS es comenten al fitxer de configuració predeterminat de Nginx.

Per activar el servidor TLS a Nginx, obriu el fitxer de configuració nginx.conf, cerqueu la línia que defineix l'inici del servidor SSL i actualitzeu tot el bloc perquè sembli a la mostra següent.

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

Fragment del bloc HTTPS de 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;
        }	
    }

El bloc anterior, a més del bloc SSL, també conté algunes declaracions per habilitar la compressió gzip i el Gestor de processos FastCGI, utilitzat per passar codi PHP a la passarel·la PHP-FPM per executar aplicacions web dinàmiques.

Després d'haver afegit el codi anterior al fitxer de configuració principal de Nginx, no reinicieu el dimoni ni apliqueu la configuració abans d'instal·lar i obtenir un certificat Let's Encrypt per al vostre domini.

Pas 2: instal·leu Certbot Client a FreeBSD

2. El procés d'instal·lació de la utilitat client de certbot Let's Encrypt a FreeBSD implica descarregar el codi font per a py-certbot i compilar-lo localment, emetent les ordres següents.

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

3. La compilació de la utilitat py-certbot requereix molt de temps en comparació amb la instal·lació d'un paquet binari normal. Durant aquest temps, cal que es descarreguin una sèrie de dependències compilades localment a FreeBSD.

A més, apareixerà una sèrie d'indicacions a la pantalla que us demanaran que seleccioneu quins paquets s'utilitzaran en el moment de la compilació per a cada dependència. A la primera pantalla, seleccioneu les eines següents, prement la tecla [espai], per compilar la dependència de python27, tal com es mostra a la imatge següent.

  • IPV6
  • LIBFFI
  • NLS
  • PYMALLOC
  • FILS
  • UCS4 per a suport Unicode

4. A continuació, seleccioneu DOCS i FILS per a la dependència de gettext-tools i premeu D'acord per continuar com es mostra a la imatge següent.

5. A la pantalla següent, deixeu l'opció TESTS desactivada per a libffi-3.2.1 i premeu D'acord per anar més enllà.

6. A continuació, premeu l'espai per seleccionar DOCS per a la dependència py27-enum34, que instal·larà la documentació d'aquesta eina, i premeu D'acord per continuar, tal com es mostra a la captura de pantalla següent.

7. Finalment, trieu instal·lar exemples de la dependència py27-openssl prement la tecla [espai] i premeu D'acord per finalitzar el procés de compilació i instal·lació del client py-certbot.

8. Un cop finalitzat el procés de compilació i instal·lació de la utilitat py-certbot, executeu l'ordre següent per actualitzar l'eina a la darrera versió del paquet, tal com es mostra a les captures de pantalla següents.

# pkg install py27-certbot

9. Per tal d'evitar alguns problemes que es poden produir en obtenir un certificat Let's Encrypt gratuït, l'error més comú és \pkg_resources.DistributionNotFound, assegureu-vos que les dues dependències següents també estiguin presents al vostre sistema: py27-salt i py27- acme.

# pkg install py27-salt
# pkg install py27-acme

Pas 3: instal·leu Let's Encrypt Certificate per a Nginx a FreeBSD

10. Per tal d'obtenir un certificat autònom de Let's Encrypt per al vostre domini, executeu l'ordre següent i proporcioneu-vos el nom de domini i tots els subdominis dels quals voleu obtenir certificats mitjançant el senyalador -d.

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

11. Mentre genereu el certificat, se us demanarà que introduïu la vostra adreça de correu electrònic i que accepteu les condicions del servei de Let's Encrypt. Escriviu a al teclat per acceptar i continuar i també se us demanarà si voleu compartir la vostra adreça de correu electrònic amb els socis de Let's Encrypt.

En cas que no vulgueu compartir la vostra adreça de correu electrònic, només heu d'escriure no paraula a la sol·licitud i premeu la tecla [Enter] per continuar. Després d'haver obtingut correctament els certificats del vostre domini, rebràs algunes notes importants que t'informaran d'on s'emmagatzemen els certificats al teu sistema i quan caduquen.

12. En cas que vulgueu obtenir un certificat Let's Encrypt mitjançant el connector webroot afegint el directori webroot del servidor Nginx per al vostre domini, emeteu l'ordre següent amb --webroot i -w banderes. De manera predeterminada, si no heu canviat la ruta de l'arrel web de Nginx, s'hauria d'ubicar a la ruta del sistema /usr/local/www/nginx/.

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

Com en el procediment --strandalone per obtenir un certificat, el procediment --webroot també us demanarà que proporcioneu una adreça de correu electrònic per a la renovació del certificat i els avisos de seguretat, per prémer a per acceptar els termes i condicions de Let's Encrypt i no o per compartir o no l'adreça de correu electrònic dels socis de Let's Encrypt tal com s'il·lustra a la mostra següent.

Tingueu en compte que el client certbot pot detectar una adreça de correu electrònic falsa i no us permetrà continuar generant un certificat fins que no proporcioneu una adreça de correu electrònic real.

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

Pas 4: actualitzeu els certificats Nginx TLS

13. La ubicació dels certificats i claus de Let's Encrypt obtinguts a FreeBSD és /usr/local/etc/letsencrypt/live/www.yourdomain.com/ ruta del sistema. Emet l'ordre ls per mostrar els components del teu certificat Let's Encrypt: el fitxer de cadena, el fitxer de cadena completa, la clau privada i el fitxer de certificat, tal com es mostra a l'exemple següent.

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

14. Per instal·lar els certificats de Let's Encrypt per al vostre domini al servidor web de Nginx, obriu el fitxer de configuració principal de Nginx o el fitxer de configuració del servidor Nginx TLS, en cas que sigui un fitxer independent, i modifiqueu les línies següents per reflectir el camí de Let's Encrypt. certificats emesos tal com es mostra a continuació.

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

Actualitzeu les línies següents perquè es vegin com en aquesta mostra:

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. A més, si la línia ssl_dhparam està present a la configuració de Nginx SSL, hauríeu de generar una nova clau Diffie–Hellman de 2048 bits amb l'ordre següent:

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

16. Finalment, per activar la configuració de Nginx TLS, primer comproveu la configuració global de Nginx per detectar possibles errors de sintaxi i, a continuació, reinicieu el servei Nginx per aplicar la configuració SSL emetent les ordres següents.

# nginx -t
# service nginx restart

17. Confirmeu si el dimoni Nginx està vinculant al port 443 emetent les ordres següents que poden enumerar tots els sòcols de xarxa oberts al sistema en estat d'escolta.

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

18. També podeu visitar la vostra adreça de domini mitjançant el protocol HTTPS obrint un navegador i escrivint l'adreça següent per confirmar que els certificats de Let's Encrypt funcionen com s'esperava. Com que utilitzeu certificats generats per una autoritat de certificació vàlida, no s'hauria de mostrar cap error al navegador.

https://www.yourdomain.com

19. La utilitat Openssl també us pot ajudar a trobar informació sobre un certificat obtingut de Let's Encrypt CA, executant l'ordre amb les opcions següents.

# openssl s_client -connect www.yourdomain.com:443

En cas que vulgueu forçar Nginx a dirigir totes les sol·licituds http a https rebudes per al vostre domini al port 80 a HTTPS, obriu el fitxer de configuració de Nginx, localitzeu la directiva del servidor per al port 80 i afegiu la línia següent després de la declaració de nom_server tal com es mostra a l'exemple següent. .

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

20. La configuració de la renovació automàtica del certificat emès per l'autoritat Let's Encrypt abans que caduquin es pot fer programant una tasca de cron per executar-se un cop al dia emetent l'ordre següent.

# crontab -e

Tasca de Cron per renovar el certificat.

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

Això és tot! Nginx ara pot oferir aplicacions web segures als vostres visitants mitjançant certificats gratuïts de Let's Encrypt.