Configurar Let’s Encrypt con HaProxy en RHEL/CentOS/SL 7

Configurar Let's Encrypt con HaProxy en RHEL/CentOS/SL 7

Let's ecnypt nos sirve de CA para tener nuestros certificados firmados sin necesadidad de pagar por ello, este es el motivo por el cual se volvio tan famoso los ultimos tiempos, "Seguridad Gratis!"

En este documento demostraremos como configurar let's encrypt con HaProxy para proteger nuestros sitios HTTP

Primero debemos instalar todos los paquetes necesarios

Instalar paquetes necesarios

yum install git bc

Descargar letsencrypt

git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Creacion del certificado

Antes de crear el certificado

Es muy importante que nos aseguremos que exista un registro DNS publico para el nombre de dominio para el cual queremos crear el certificado y que apunte a la IP de nuestro HaProxy, tambien debemos bajar el HaProxy debido a que el plugin standalone de la herramienta certbot necesita abrir los puertos 80 y 443, debemos de asegurarnos que desde internet se pueda acceder a los puerto 80 y 443 de nuestro servidor.

service haproxy stop

Ejecutar Let's Encrypt y obtener nuestro certificado

El comando letsencrypt-auto se encarga de instalar y configurar todas las dependencias que necesitamos para crear nuestros certificados.

Las opciones que utilizamos son las siguientes:

-d dominio.com: Aqui ingresamos el dominio para el cual queremos crear el certificado
-m maildeladministrador@dominio.com: Aqui ingresamos el correo del administrador, este correo nos podria ayudar en el futuro para recuperar los archivos .key
--agree-tos: Esta opcion acepta los terminos de servicio de let's encrypt

# /opt/letsencrypt/letsencrypt-auto certonly --standalone -d www.infratic.com -m vic.ad94@gmail.com --agree-tos
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for www.infratic.com
Waiting for verification...
Cleaning up challenges
 
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.infratic.com/fullchain.pem. Your cert
   will expire on 2017-08-08. To obtain a new or tweaked version of
   this certificate in the future, simply run letsencrypt-auto again.
   To non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"
 - 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

Esto nos tuvo que crear los siguientes archivos en el directorio /etc/letsencrypt/live/dominio.com/

La descripcion de los diferentes archivos que se encuentran en dicho directorio son las siguientes

cert.pem: Your domain's certificate
chain.pem: The Let's Encrypt chain certificate
fullchain.pem: cert.pem and chain.pem combined
privkey.pem: Your certificate's private key

Configurar HaProxy para usear certificados

Preparando los ceriticados

Ahora debemos crear el .pem para el haproxy dentro de la carpeta /etc/haproxy/certs

# mkdir /etc/haproxy/certs
# cat /etc/letsencrypt/live/www.infratic.com/fullchain.pem /etc/letsencrypt/live/www.infratic.com/privkey.pem >> /etc/haproxy/certs/www.infratic.com.pem

Luego debemos crear el archivo /etc/haproxy/certs/list.txt que nos permitira tener varios dominios con sus respectivos certificados en el mismo balanceador

El archivo debe tener la siguiente sintaxis

/ruta/archivo/dominio.com.pem dominio.com

En este caso

/etc/haproxy/certs/www.infratic.com.pem       www.infratic.com

Para esto podemos usar el comando echo

# echo "/etc/haproxy/certs/www.infratic.com.pem       www.infratic.com" >>  /etc/haproxy/certs/list.txt

Configurando HaProxy

Lo que debemos hacer en nuestro HaProxy es definir la lista de certificados para el frontend o listen
En este caso configuraremos nuestro frontend el cual tendra un solo backend, recuerden que pueden tener mas backend utilizando ACLs en el frontend

Configurar el frontend

Creamos el frontend que escuchara en el puerto 443 y publicara nuestro certificado agregando las siguientes lineas al archivo /etc/haproxy/haproxy.cfg.

En el frontend se crea una ACL llamada letsencrypt-acl del tipo path_beg, esta ACL nos servira mas adelante al momento de renovar los certificados

frontend www-https
   bind 0.0.0.0:443 ssl crt-list /etc/haproxy/certs/list.txt
   reqadd X-Forwarded-Proto:\ https
   acl letsencrypt-acl path_beg /.well-known/acme-challenge/
   use_backend letsencrypt-backend if letsencrypt-acl
   default_backend www-backend

Configurar el backend

Creamos nuestro backend agregando las siguientes lineas al archivo /etc/haproxy/haproxy.cfg

backend b_webfarm
    mode http
    option forwardfor
    balance source
    cookie SRVNAME insert nocache
    server  av-app1 av-app1.infratic.com:80 cookie S1 check port 80 inter 10s weight 1
    server  av-app2 av-app2.infratic.com:80 cookie S2 check port 80 inter 10s weight 10

Luego debemos crear un backend que se utiliza para las validaciones de letsencrypt, que nos permite actualizar luego el certificado sin detener el servicio haproxy, este backend es referenciado en el fronted que creamos previamente, para eso agregamos las siguientes lineas al archivo /etc/haproxy/haproxy.cfg

backend letsencrypt-backend
   server letsencrypt 127.0.0.1:54321

Configurar renovacion automatica

Los certificados de Let's Encrypt tienen una duracion maxima de 90 dias, en este caso configuraremos la auto-renovacion cada 2 meses de forma a que tengamos tiempo para resolver problemas de autualizacion en caso de que se presenten
Para esta tarea crearemos un script que reciba como parametro el nombre del dominio y ejecute todos los comandos necesarios para la renovacion

# vi /opt/letsencrypt/renew.sh

Y agregamos lo siguiente

#!/bin/bash
dominio=$1
/opt/letsencrypt/letsencrypt-auto certonly --agree-tos --renew-by-default --standalone-supported-challenges http-01 --http-01-port 54321 -d $dominio
cat /etc/letsencrypt/live/$dominio/fullchain.pem /etc/letsencrypt/live/$dominio/privkey.pem >> /etc/haproxy/certs/$dominio.pem
service haproxy reload

Luego asignamos permisos de ejecucion al script

chmod 755 /opt/letsencrypt/renew.sh

Ahora debemos agregar una tarea cron que ejecute este script cada 2 meses

crontab -e

Y agregamos

00 02 * */2 * /opt/letsencrypt/renew.sh

Un comentario en “Configurar Let’s Encrypt con HaProxy en RHEL/CentOS/SL 7

Deja un comentario