Configurar certificados SSL en NGINX con Let’s Encrypt

SSL (Secure Sockets Layer o capa de conexión segura) es un estándar de seguridad global que permite la transferencia de datos cifrados entre un navegador y un servidor web.

Los certificados son emitidos por autoridades certificadoras (CA) que garantizan que la persona u organización que está detrás del certificado es quien dice ser y está autorizada a utilizar ese dominio. Las CA son reconocidas por los navegadores y se encargan de sellar el certificado SSL para darle validez y vigencia.

Puedes conseguir un certificado SSL comprándolo a través de una CA o de forma totalmente gratuita a través de Let’s Encrypt tal y como veremos en este artículo.

¿Qué es Let’s Encrypt?

Let’s Encrypt es una Autoridad de Certificación gratuita, automatizada, y abierta.

Proporciona dos tipos de certificados. El SSL individual estándar y el SSL Wildcard, que no solamente cubre el dominio individual si no también todos sus subdominios. Ambos tipos de certificados se emiten por un período de 90 días aunque es posible renovarlos automáticamente.

Requisitos Previos

Antes de empezar asegúrate de cumplir los siguientes requisitos:

  • Tener un servidor con NGINX o NGINX Plus instalado y acceso al mismo.
  • Tener un dominio registrado y acceso a la configuración del mismo.
  • Configurar los DNS del dominio para que apunten a la IP pública del servidor.

Los pasos que se describen a continuación están probados en Ubuntu Server 18.04 LTS (Bionic Beaver).

Paso 1 – Descargar certbot

Certbot es el cliente de Let’s Encrypt que nos permitirá obtener el certificado. En primer lugar creamos el repositorio.

$ add-apt-repository ppa:certbot/certbot

Instalamos certbot.

$ apt-get update
$ apt-get install python-certbot-nginx

Hecho esto ya tendremos el cliente instalado y podremos seguir con la configuración.

Paso 2 – Configuración NGINX

El siguiente paso es preparar los bloques de servidor de NGINX. Certbot los puede configurar automáticamente siempre que contengan el dominio para el que estamos pidiendo el certificado en el campo server_name. Para este artículo utilizaremos el dominio ejemplo.com.

Abriremos el fichero de configuración del bloque de servidor. En este caso he llamado a mi fichero ejemplo.com.conf.

Es recomendable utilizar un bloque de servidor para cada sitio web en vez del fichero de configuración por defecto.

$ sudo nano /etc/nginx/sites-available/ejemplo.com.conf

Una vez abierto nos aseguramos que tenemos correctamente escrito el nombre de dominio en el campo server_name.

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

Si algo no es correcto lo modificamos y guardamos. Cuando generamos el certificado con certbot detectará el dominio en este fichero y lo configurará automáticamente.

Para comprobar si hay algún error en la configuración y reiniciar NGINX podemos utilizar el siguiente comando.

$ nginx -t && nginx -s reload

Una vez finalizado este paso, ya podremos obtener el certificado.

Paso 3 – Obtener el Certificado SSL

Utilizaremos el siguiente comando para generar el certificado con el plugin de NGINX.

$ sudo certbot --nginx -d ejemplo.com -d www.ejemplo.com

Durante el proceso se te preguntarán una serie de datos como el correo electrónico y aceptar los términos del servicio de Let’s Encrypt.

Cuando el proceso finalice, NGINX se reiniciará con la nueva configuración y se mostrará un mensaje indicando que la generación se ha realizado correctamente y las rutas donde se va a guardar el certificado.

Congratulations! You have successfully enabled https://ejemplo.com and https://www.ejemplo.com 

-------------------------------------------------------------------------------------
IMPORTANT NOTES: 

Congratulations! Your certificate and chain have been saved at: 
/etc/letsencrypt/live/ejemplo.com/fullchain.pem 
Your key file has been saved at: 
/etc/letsencrypt/live/ejemplo.com/privkey.pem
Your cert will expire on 2020-04-04.

Si volvemos a abrir el fichero de configuración del bloque de servidor veremos que se ha modificado.

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/ejemplo.com;
    server_name  ejemplo.com www.ejemplo.com;

    listen 443 ssl; # managed by Certbot

    # RSA certificate
    ssl_certificate /etc/letsencrypt/live/ejemplo.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/ejemplo.com/privkey.pem; # managed by Certbot

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

    # Redirect non-https traffic to https
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot
}

En este momento, ya tendrás el certificado instalado correctamente y podrás acceder a tu web a través de https://ejemplo.com.

Paso 4 – Renovar automáticamente el certificado

Los certificados de Let’s Encrypt caducan a los 90 días. Si no quieres tener que renovarlo manualmente aquí te dejo como hacerlo de forma automática utilizando un trabajo cron.

Abrimos el fichero crontab.

$ crontab -e

Añadimos el comando de renovación de certbot para que se ejecute diariamente. Este comando comprobará si va a expirar algún certificado en los próximos 30 días, y si es así, lo renovará.

0 12 * * * /usr/bin/certbot renew --quiet

Guarda y cierra el fichero y habrás terminado el proceso. Ahora solo queda disfrutar de tu nuevo certificado SSL.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.