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:
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:
¡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.