Búsqueda de sitios web

Cómo proteger Nginx con SSL y Let's Encrypt en FreeBSD


En esta guía discutiremos cómo proteger el servidor web Nginx en FreeBSD con certificados TLS/SSL ofrecidos por Let's Encrypt Certificate Autoridad. También le mostraremos cómo renovar automáticamente los certificados de 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 navegador del cliente, para asegurar la conexión, de modo que un tercero, que podría interceptar el tráfico, no pueda descifrarlo. la transmisión.

Lea también: Instale Let's Encrypt para Apache en FreeBSD

El proceso de obtención de un certificado Let's Encrypt gratuito en FreeBSD se puede simplificar enormemente instalando la utilidad cliente certboot, que es el cliente oficial de Let's Encrypt utilizado. para generar y descargar certificados.

Requisitos

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

Después de haber 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 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. Compilar la utilidad py-certbot lleva mucho tiempo en comparación con instalar un paquete binario normal. Durante este tiempo, es necesario descargar una serie de dependencias compiladas localmente en FreeBSD.

Además, aparecerá una serie de indicaciones en su pantalla, exigiéndole que seleccione qué paquetes se utilizará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 a continuación.

  • IPV6
  • LIBFFI
  • SNL
  • Pymalloc
  • HILOS
  • UCS4 para soporte 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 PRUEBAS desactivada para libffi-3.2.1 y presione Aceptar para moverse. más.

6. A continuación, presione espacio para seleccionar DOCS para la dependencia py27-enum34, que instalará la documentación para esta y presione Aceptar para continuar, como se ilustra en la siguiente captura de pantalla.

7. Finalmente, elija instalar ejemplos de ejemplo para la dependencia py27-openssl presionando la tecla [espacio] y presione Aceptar > para finalizar el proceso de compilación e instalación del 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 la siguientes capturas de pantalla.

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 el certificado Let's Encrypt para Nginx en FreeBSD

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

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 acepte los términos de servicio de Let's Encrypt. Escriba a en el teclado para aceptar y continuar. 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 obtenidos con éxito los certificados para su dominio, 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 utilizando el complemento “webroot” agregando el directorio webroot del servidor Nginx para su dominio. , emita el siguiente comando con los indicadores --webroot y -w. De forma predeterminada, si no ha cambiado la ruta webroot de Nginx, debe ubicarse en la ruta del sistema /usr/local/www/nginx/.

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

Al igual que 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 los 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 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.

Muestra 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

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 la ruta del sistema /usr/local/etc/letsencrypt/live/www.yourdomain.com/. 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 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 TLS de Nginx, en caso de que sea un archivo separado, y modifique las líneas siguientes para reflejar la ruta de los certificados emitidos por let's Encrypt 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, debes generar un nuevo 2048 bit. Tecla Diffie–Hellman con el siguiente comando:

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

16. Finalmente, para activar la configuración TLS de Nginx, primero verifique la configuración global de Nginx para detectar 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 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 la dirección de su dominio a través del protocolo HTTPS abriendo un navegador y escribiendo la siguiente dirección para confirmar que los certificados Let's Encrypt funcionan como se esperaba. Debido a que está utilizando certificados generados por una autoridad certificadora válida, no debería aparecer ningún error en el navegador.

https://www.yourdomain.com

19. La utilidad Openssl también puede ayudarle 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, busque 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. Se puede configurar la renovación automática para el certificado emitido por la autoridad Let's Encrypt antes de que caduque 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 los certificados gratuitos de Let's Encrypt.