Haciendo del Desarrollo y la Arquitectura Web, ciencia y pasión.

Securiza tu web con Let's Encrypt

Ya teniamos la web terminada, la habiamos subido a un repositorio y hasta aprendimos a desplegarla usando git hooks o jenkins. Pero un capítulo estaba pendiente: hacerla segura. Allá por 2018 Google empezó a penalizar los sitios no seguros, y los que no llevaban el encabezado https:// los marcaba con una advertencia de "sitio no seguro". Ahora considera el protocolo valido y por defecto al https, así que de cara al posicionamiento es crucial. Garantiza varias cosas, pero la principal caracteristica es que la web que muestra un candado en su direccion, es legal y relamente es quien dice ser. La segunda propiedad que ganamos al instalar un certificado es que cifra nuestar conexion, así la comunicación cliente-servidor queda protegida con el protocolo SSL/TLS.

Esto nos protege de ataques Man-in-the-middle. Consiste en que un atacante se situa entre el cliente y el servidor intrereceptando el trafico, espiando el contenido y hasta insertando su propio contenido sin que las dos partes puedan advertirlo.

Gracias a la conexion HTTPS este riesgo se elimina. Evidentemente tenemos que tener cuidado de que a donde nos conectemos este presente el candadito.

Otro de los riesgos de la web, el conocido phishing, donde una web se hace pasar por tu banco o tienda habitual, y captura tus credenciales. En algunos casos hasta tienen la cortesia de hacer de puente a la web real permitiendo que uses el servicio real. Sin embargo tus credenciales ya están comprometidas.

Existen innumerables servicios que te venden certificados SSL, desde 5 euros. Existen certificados para un dominio o para varios en cuyo caso el precio es mayor y dependiendo del tipo, la caducidad pueden ser increiblemente caros.

Pero hoy os voya hablar de Lets Encrypt. Lets Encrypt es un Autoridad de certificación, por sus siglas en ingles CA, que es publica, gratuita y segura. Es un servicio mantenido por la Internet Security Research Group (ISRG). La ISRG tiene como misión, cito: "el reducir las barreras financieras, tecnológicas y educativas que impiden una comunicación segura a través de Internet". La ISRG fue fundada en 2013 y desde entonces Let's encrypt es uno de sus proyectos de beneficio público. Los sponsors de la IGSR son las grandes de siempre, Moz://a, Cisco, AWS, Chrome, Facebook, etc y mas de 100 empresas del sector.

Bueno, pues vamos a ello. ¿Qué necesitamos para poder hacer funcionar el certificado? Los prerequisitos!. Lo primero que necesitamos es un dominio registrado que tenga los dos registros A, www.your_domain.xxx y your_domain.xxx del DNS apuntando a una IP publica. no necesariamente estática, la de casa valdrá perfectamente (¿No es fantastico? ;^)). Un servidor con Linux, donde tengas acceso root y firewall y Apache server con un virtual host correctamente configurado.

Empecemos! Tenemos que instalar un programa llamada Certbot, así que primero vamos con el repositorio que tenemos que añadir al sistema, hacemos un :

sudo add-apt-repository ppa:certbot/certbot

y lo instalamos:

sudo apt install python-certbot-apache

El script de certbot necesita poder encontrar en el servidor un virtualhost, que modificará para hacer una redirección al nuevo virtualhost securizado. Si vamos a securizar mysite.com debería haber una entrada en la carpeta de entradas de Apache:

/etc/apache2/sites-available/mysite.conf

que incluya el tag: servername mysite.com. Perfecto, podemos lanzar el siguiente comando para checkear la configuración:

sudo apache2ctl configtest

Si diera error refrescar con un reload.

sudo systemctl reload apache2

Ahora el firewall. Revisemos que está el firewall levantado y que permite el trafico:

sudo ufw status 

Deberia sacar algo así como:

 Output Status: active To Action From -- ------ ---- 
OpenSSH ALLOW Anywhere
Apache ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache (v6) ALLOW Anywhere (v6)

Bien pues configuramos el trafico https y eliminamos el viejo

sudo ufw allow 'Apache Full' 
sudo ufw delete allow 'Apache' 

Ahora la salida del comando de status nos devuelve:


Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Apache Full                ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Apache Full (v6)           ALLOW       Anywhere (v6)        

Perfecto vamos a por el certificado. Lo solicitamos con :

sudo certbot --apache -d mysite.com -d www.mysite.com

Si es la primera vez cumplimenta el formulario con los datos del solicitante. Si todo va bien nos preguntará donde se hace la redireccion cuando es HTTP. Decimos a https:


Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Y finalmente nos mostrará un infome mas o menos asi:


Output
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/mysite/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/your_domain/privkey.pem
   Your cert will expire on 2018-07-23. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /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

Con esto ha terminado toda la configuracion y ya deberiamos ver nuestra web bajo https con su candado y todo. Con el comando podemos ver en que estado esta nuestro certificado:

sudo systemctl status certbot.timer

Y saldra algo parecido a esto:


Output
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Tue 2020-04-28 17:57:48 UTC; 17h ago
    Trigger: Wed 2021-04-29 23:50:31 UTC; 12h left
   Triggers: ● certbot.service

Apr 28 17:57:48 fine-turtle systemd[1]: Started Run certbot twice daily.

Y si, efectivamente los certificados tienen una vida de 3 meses, que son facilmente renovables, add infinitum con el siguiente comando. Bastará con meterlo en una tarea con el cron para renovarlo periodicamente. Hacerlo antes de los últimos 30 dias, antes no se puede salvo que se fuerce:

sudo certbot renew --dry-run

Una visita a la carpeta /etc/apache/sites-avaialbe confirmará que efectivamente tenemos un nuevo virtual host que incluye los nuevos certificados que se pueden encontrar en: /etc/letsencrypt/live/mysite/fullchain.pem. Ademas el antiguo virtualhost que daba servicio a HTTP ha sido modificado con unas lineas que redireccionan el trafico del puerto 80 a nuestro flamante puerto 443:

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.mysite.org [OR]
RewriteCond %{SERVER_NAME} =mysite.org
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

Y ahora ya si está todo listo. Esppero que haya sido de utilidad