Cómo proteger Nginx con SSL y cifremos en FreeBSD


En esta guía, analizaremos cómo proteger el servidor web Nginx en FreeBSD con los certificados TLS/SSL ofrecidos por Let’s Encrypt Certificate Authority. También le mostraremos cómo renovar automáticamente los certificados Lets ’Encrypt antes de la fecha de vencimiento.

TLS, acrónimo de Transport Layer Security, es un protocolo que se ejecuta bajo el protocolo HTTP y utiliza certificados y claves para encapsular los paquetes y cifrar los datos intercambiados entre un servidor y un cliente, o en este caso entre el servidor web Nginx y el cliente. navegador, para asegurar la conexión, de modo que un tercero, que podría interceptar el tráfico, no pueda descifrar la transmisión.

El proceso de obtener un certificado Let’s Encrypt gratuito en FreeBSD se puede simplificar enormemente instalando la utilidad de cliente certboot, que es el cliente oficial Let’s Encrypt que se utiliza para generar y descargar certificados.

  1. Instale la pila FBEMP (Nginx, MariaDB y PHP) en FreeBSD

Paso 1: configurar Nginx TLS/SSL

1. De forma predeterminada, la configuración del servidor TLS/SSL no está habilitada en FreeBSD porque las declaraciones de bloqueo del servidor TLS están comentadas en el archivo de configuración predeterminado de Nginx.

Para activar el servidor TLS en Nginx, abra el archivo de configuración nginx.conf, busque la línea que define el inicio del servidor SSL y actualice todo el bloque para que se vea como en el siguiente ejemplo.

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

Extracto del bloque Nginx HTTPS:

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 bloque anterior, además del bloque SSL, también contiene algunas declaraciones para habilitar la compresión gzip y FastCGI Process Manager, que se utiliza para pasar código PHP a la puerta de enlace PHP-FPM para ejecutar aplicaciones web dinámicas.

Una vez que haya agregado el código anterior al archivo de configuración principal de Nginx, no reinicie el demonio ni aplique la configuración antes de instalar y obtener un certificado Let's Encrypt para su dominio.

Paso 2: Instale el cliente Certbot en FreeBSD

2. El proceso de instalación de la utilidad de cliente Let's Encrypt certbot en FreeBSD implica descargar el código fuente de py-certbot y compilarlo localmente, emitiendo los siguientes comandos.

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

3. La compilación de la utilidad py-certbot lleva mucho tiempo en comparación con la instalación de un paquete binario normal. Durante este tiempo, es necesario descargar una serie de dependencias compiladas localmente en FreeBSD.

Además, una serie de mensajes aparecerán en su pantalla, exigiéndole que seleccione qué paquetes se usarán en el momento de la compilación para cada dependencia. En la primera pantalla, seleccione las siguientes herramientas, presionando la tecla [espacio], para compilar la dependencia python27, como se ilustra en la imagen de abajo.

  • IPV6
  • LIBFFI
  • NLS
  • PYMALLOC
  • HILOS
  • UCS4 para compatibilidad con Unicode

4. A continuación, seleccione DOCS y THREADS para la dependencia de gettext-tools y presione OK para continuar como se muestra en la imagen de abajo.

5. En la siguiente pantalla, deje la opción TESTS desactivada para libffi-3.2.1 y presione OK para avanzar.

6. Luego, presione la barra espaciadora para seleccionar DOCS para la dependencia py27-enum34, que instalará la documentación para esta herramienta, y presione OK para continuar, como se ilustra en la siguiente captura de pantalla.

7. Finalmente, elija instalar muestras de ejemplo para la dependencia py27-openssl presionando la tecla [espacio] y presione OK para finalizar el proceso de compilación e instalación para el cliente py-certbot.

8. Una vez finalizado el proceso de compilación e instalación de la utilidad py-certbot, ejecute el siguiente comando para actualizar la herramienta a la última versión del paquete, como se ilustra en las capturas de pantalla a continuación.

# pkg install py27-certbot

9. Para evitar algunos problemas que pueden ocurrir al obtener un certificado Let's Encrypt gratuito, el error más común es "pkg_resources.DistributionNotFound", asegúrese de que las siguientes dos dependencias también estén presentes en su sistema: py27-salt y py27-acme .

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

Paso 3: Instale Let's Encrypt Certificate para Nginx en FreeBSD

10. Para obtener un certificado independiente Let's Encrypt para su dominio, ejecute el siguiente comando y proporcione su nombre de dominio y todos los subdominios para los que desea obtener certificados mediante la marca -d .

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

11. Mientras genera el certificado, se le pedirá que ingrese su dirección de correo electrónico y que acepte los términos de servicio de Let's Encrypt. Escriba a en el teclado para aceptar y continuar, y también se le preguntará si desea compartir su dirección de correo electrónico con los socios de Let's Encrypt.

En caso de que no desee compartir su dirección de correo electrónico, simplemente escriba no palabra en el mensaje y presione la tecla [enter] para continuar. Una vez que los certificados para su dominio se hayan obtenido con éxito, recibirá algunas notas importantes que le informarán dónde se almacenan los certificados en su sistema y cuándo caducan.

12. En caso de que desee obtener un certificado Let's Encrypt usando el complemento "webroot" agregando el directorio webroot del servidor Nginx para su dominio, emita el siguiente comando con --webroot y -w banderas. De forma predeterminada, si no ha cambiado la ruta de la raíz web de Nginx, debe ubicarse en/usr/local/www/nginx/system path.

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

Como en el procedimiento --strandalone para obtener un certificado, el procedimiento --webroot también le pedirá que proporcione una dirección de correo electrónico para la renovación del certificado y avisos de seguridad, para presionar a para aceptar los términos y condiciones de Let's Encrypt y no o yes para compartir o no la dirección de correo electrónico de los socios de Let's Encrypt como se ilustra en el siguiente ejemplo.

Tenga en cuenta que el cliente de certbot puede detectar una dirección de correo electrónico falsa y no le permitirá continuar generando un certificado hasta que proporcione una dirección de correo electrónico 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 protected]  #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 protected]

-------------------------------------------------------------------------------
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

Paso 4: Actualice los certificados TLS de Nginx

13. La ubicación de los certificados y claves de Let's Encrypt obtenidos en FreeBSD es /usr/local/etc/letsencrypt/live/www.yourdomain.com/ ruta del sistema. Emita el comando ls para mostrar los componentes de su certificado Let's Encrypt: el archivo de cadena, el archivo de cadena completa, la clave privada y el archivo de certificado, como se ilustra en el siguiente ejemplo.

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

14. Para instalar los certificados Let's Encrypt para su dominio en el servidor web Nginx, abra el archivo de configuración principal de Nginx o el archivo de configuración para el servidor Nginx TLS, en caso de que sea un archivo separado, y modifique las siguientes líneas para reflejar la ruta de Let's Encrypt certificados emitidos como se ilustra a continuación.

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

Actualice las siguientes líneas para que se vean como en este ejemplo:

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. Además, si la línea ssl_dhparam está presente en la configuración de Nginx SSL, debe generar una nueva clave Diffie – Hellman de 2048 bits con el siguiente comando:

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

16. Finalmente, para activar la configuración de Nginx TLS, primero verifique la configuración global de Nginx en busca de posibles errores de sintaxis y, luego, reinicie el servicio Nginx para aplicar la configuración SSL emitiendo los siguientes comandos.

# nginx -t
# service nginx restart

17. Confirme si el demonio de Nginx está vinculado al puerto 443 emitiendo los siguientes comandos que pueden enumerar todos los sockets de red abiertos en el sistema en estado de escucha.

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

18. También puede visitar su dirección de dominio a través del protocolo HTTPS abriendo un navegador y escribiendo la siguiente dirección para confirmar que los certificados de Let's Encrypt funcionan como se esperaba. Debido a que está utilizando certificados generados por una autoridad de certificación válida, no debe aparecer ningún error en el navegador.

https://www.yourdomain.com

19. La utilidad Openssl también puede ayudarlo a encontrar información sobre un certificado obtenido de Let’s Encrypt CA, ejecutando el comando con las siguientes opciones.

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

En caso de que desee forzar a Nginx a dirigir todas las solicitudes http a https recibidas para su dominio en el puerto 80 a HTTPS, abra el archivo de configuración de Nginx, ubique la directiva del servidor para el puerto 80 y agregue la siguiente línea después de la declaración server_name como se ilustra en el siguiente ejemplo .

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

20. La configuración de la renovación automática para los certificados emitidos por la autoridad Let’s Encrypt antes de que caduquen se puede realizar programando un trabajo cron para que se ejecute una vez al día emitiendo el siguiente comando.

# crontab -e

Tarea cron para renovar el certificado.

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

¡Eso es todo! Nginx ahora puede ofrecer aplicaciones web seguras a sus visitantes utilizando certificados gratuitos Let's Encrypt.