Asegurar Nginx con Let's Encrypt en Ubuntu 20.04

Cómo asegurar Nginx con Let’s Encrypt en Ubuntu 20.04

Disponer de un certificado TLS/SSL en un sitio web presenta sus ventajas. En primer lugar, brinda confianza a los visitantes al asegurarles que el tráfico entre su navegador y el servidor está encriptado. Esto es particularmente importante si el sitio requiere iniciar sesión para transmitir información privada o manipular datos de usuario. Por otro lado, Google bloquea sitios HTTP en los resultados de búsquedas. Para que tus futuros visitantes te encuentren y confíen en ti, esta guía te enseñará cómo asegurar Nginx con Let’s Encrypt en Ubuntu 20.04.

Requisitos previos

Antes de dar comienzo a la lectura de esta guía, te recomendamos completar los siguientes pasos si todavía no lo has hecho:

  • Llevar a cabo la configuración básica del servidor como explicamos en la guía inicial de esta serie.
  • Instalar un stack LEMP y verificar su funcionamiento.
  • Registrar un dominio a tu nombre y realizar la delegación de DNS. En esta guía utilizaremos cloudme.fun a modo de ejemplo.
  • Verificar que exista una regla en el cortafuegos de Donweb que permita el tráfico entrante al puerto 443/TCP. Si necesitas asistencia, puedes consultar el artículo Firewall en la sección de ayuda.

Paso 1: Instalación de Certbot

Let’s Encrypt recomienda el uso de una herramienta llamada Certbot para automatizar la emisión y la instalación de certificados. Debido a que está disponible en los repositorios de Ubuntu y tiene un plugin para Nginx, instalaremos ambos con el siguiente comando:

sudo apt install certbot python3-certbot-nginx -y

Cuando se complete la instalación, vas a realizar la configuración de Nginx para tu dominio y la integración con Certbot a fin de asegurarlo.

Paso 2: Configuración del dominio y el sitio en Nginx

La configuración por defecto (/etc/nginx/sites-enabled/default) es útil si planeas hospedar solamente un sitio en el servidor. Sin embargo, lo más probable es que desees alojar uno por dominio como en este caso.

Nginx emplea el concepto de bloques de servidor para separar distintos sitios, de forma análoga a los hosts virtuales de Apache. En este ejemplo, vamos a crear un bloque de servidor para el dominio cloudme.fun copiando las siguientes líneas en el archivo /etc/nginx/conf.d/cloudme.fun.conf:

server {
     listen 80 default_server;
     listen [::]:80 default_server;
     root /var/www/cloudme.fun;
     server_name cloudme.fun www.cloudme.fun;
 }

Debido a que tanto este archivo como la configuración del sitio por defecto utilizan la directiva default_server, es recomendable eliminar este último mediante sudo rm /etc/nginx/sites-enabled/default.

Luego de guardar los cambios, necesitarás crear el directorio cloudme.fun dentro de /var/www a fin de almacenar posteriormente los archivos del sitio:

sudo mkdir /var/www/cloudme.fun

Antes de continuar, verifica que Nginx pueda leer correctamente la configuración y que no haya errores:

sudo nginx -t && sudo nginx -s reload

De no encontrar errores, el resultado debería ser el siguiente:

Caso contrario, puedes analizar el mensaje informativo del comando anterior para identificar la causa.

Paso 3: Integración de Nginx con Certbot

Una vez que te hayas asegurado que la configuración de Nginx es correcta, utiliza el siguiente comando a fin de generar el certificado. Es importante aclarar que debes incluir las variantes cloudme.fun y www.cloudme.fun para que el certificado aplique a ambas:

sudo certbot --nginx -d cloudme.fun -d www.cloudme.fun

A continuación se te solicitará:

  • Ingresar una dirección de correo electrónico a la que se enviarán avisos de renovación y seguridad.
  • Aceptar los términos de servicio de Let’s Encrypt.
  • Indicar si deseas recibir comunicaciones informativas de la EFF (Electronic Frontier Foundation)
  • Establecer redirección de HTTP a HTTPS para el dominio (elige la opción 2 para confirmar)

Si todo salió correctamente, el proceso debe haber modificado el archivo /etc/nginx/conf.d/cloudme.fun.conf de la siguiente manera:

Configurando Nginx con Let's Encrypt

El certificado que acabas de instalar expirará dentro de tres meses. Por ese motivo, Certbot incluye un timer de systemd que se ejecuta dos veces al día para renovar automáticamente cualquier certificado que venza dentro de los próximos 30 días:

systemctl status certbot.timer

Como se aprecia en la imagen de arriba, el timer se activó cuando instalamos Certbot.

Paso 4: Agregar un archivo al sitio y verificar

El código que aparece a continuación representa el contenido básico de un archivo HTML. Guárdalo como index.html en /var/www/cloudme.fun:

Para finalizar, visita el sitio desde tu navegador y verifica la presencia del certificado:

Nuestro sitio ya tiene su certificado con Let's Encrypt

¡Felicitaciones! Tu sitio está funcionando correctamente sobre HTTPS.

Conclusión

En esta guía aprendiste cómo generar un certificado para asegurar un sitio web con Let’s Encrypt. Utilizando otros bloques de servidor en Nginx, puedes alojar otros sitios en el mismo servidor repitiendo los pasos 2 al 4.

¿Te resultó útil esta guía?

Imagen por defecto
Gabriel Cánepa
Gabriel trabaja actualmente como desarrollador full-stack en Scalar, una firma que se dedica a hacer valuaciones de empresas. Es Administrador de Sistemas certificado por la Fundación Linux y previamente ha escrito un gran número de artículos y contenidos técnicos sobre el tema para: DigitalOcean, Linode, Carrera Linux Argentina y Tecmint. Tiene una certificación en programación de la Universidad de Brigham Young-Idaho, y está completando las carreras de programador y analista de sistemas en la Universidad Nacional de Villa Mercedes (UNViMe). En su tiempo libre, Gabriel disfruta leyendo libros de Stephen R. Covey, tocando piano y guitarra, y enseñando conocimientos de programación a su dos hijas.