SSL en tu sitio fácil y gratis con Let's Encrypt

Published Aug 12, 2018 22:28 UTC on Yaroslav's weblog

Es bien sabido en esta época que la seguridad es una parte importante de desarrollo web, y no solamente. Y como olvidar ese suculento SEO de Google, que da prioridad a sitios que usan https en lugar del antiguo http (Aunque para ser sincero me da igual Google, sin embargo mis clientes y la mayoría de los que lleguen a leer esto si le dan importancia)

Quieres agregarle SSL a tu sitio, pero vaya, que esos certificados cuestan dinero. Ah, pero he ahí donde estás equivocado (A menos que ya sepas a cerca de Let's Encrypt y simplemente hayas entrado a leer este tutorial para saber como generar un certificado. En dado caso sinceramente pido perdón por esta patética introducción).

En esta guía detallaré los pasos para adquirir un certificado SSL de Let's Encrypt con Certbot en un servidor con nginx. Instalaré Certbot en un servidor Debian Stretch, si usas otra distro de Linux (o BSD, etc.) es probable que necesites usar otro comando para instalarlo.

Primero instalamos Certbot

# apt-get install certbot

Antes de podar instalar certificados, necesitamos configurar nginx para ello. Podemos modificar la configuración por defecto para ello. Necesitamos hacer esto para que el servidor de Let's Encrypt puede leer el archivo de "desafío" para verificar que en efecto el(los) dominio(s) nos pertenece(n).

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name _;

        # This is so that Let's Encrypt can look for the challenge
        location /.well-known/acme-challenge/ {
                root /var/www/html/;
                default_type text/plain;
        }

        # The rest of your configuration...
}

Una vez editado el archivo de configuración necesitamos reiniciar nginx.

# sudo systemctl restart nginx

Después de reiniciar nginx podemos proceder con la instalación del certificado. En mi caso necesito el certificado para múltiples subdominios, por lo tanto los agregaré usando la opción -d para cada uno de ellos en mi lista de argumentos como en el ejemplo siguiente

# certbot certonly --webroot -w /var/www/html -d www.example.com -d example.com

Durante el proceso de generación de certificados Certbot te pedirá tu correo electrónico. Let's Encrypt enviará notificaciones a el cuando el certificado esté a punto de expirar, sin embargo Certbot se encargará de renovarlos antes de que expiren automáticamente.

Con esto nuestros certificados están instalados en el servidor y listos para ser usados. Lo último que queda por hacer es configurar nginx para que use los certificados y redirija de http a https. En las variables ssl_certificate ssl_certificate_key ponemos la dirección en el sistema de archivos de nuestro certificado y nuestra llave publica.

server {
        listen 80;
        listen [::]:80;
        server_name www.example.com;
        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;

        server_name www.example.com;
        ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
        ssl_certificate_key /path/to/key/www.example.com/privkey.pem;
        location /static/ {
                alias /home/webuser/mysite/static/;
        }
        location /media/ {
                alias /home/webuser/mysite/media/;
        }
        location / {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                proxy_pass http://127.0.0.1:8001;
        }
}

Un contra de redirigir a https automáticamente es que los exploradores antiguos que no son compatibles con https no podrán abrir el sitio web. Pero vaya, que estamos en 2018, no deberíamos de preocuparnos por exploradores de hace 10 y más años.

Para más información acerca de Certbot: https://certbot.eff.org/docs/using.html

Actualización (2018/11/02): Hace un tiempo en 2018, Let's Encrypt agregó la posibilidad de generar un certificado "universal" para todos los subdominios (por ejemplo, *.example.com).

Para generar dicho certificado, primero necesitamos descargar la última versión de certbot del repositorio oficial de git

$ git clone https://github.com/certbot/certbot.git

Después entramos al directorio "certbot" y ejecutamos

$ ./certbot-auto certonly --manual \
> --preferred-challenges=dns \
> --email email@example.com \
> --server https://acme-v02.api.letsencrypt.org/directory \
> --agree-tos \
> -d *.example.com

Certbot te presentará con un "desafío" de DNS en el que tendrás que agregar una entrada de tipo TXT a la configuración de tu dominio, ya que este tipo de certificados sólo funciona con el "reto" de dns. Asegúrate de que tu configuración de DNS ya esté actualizada antes presionar "Enter".

También ten en cuenta que actualmente no es posible renovar automáticamente certificados de este tipo.