Saltar al contenido principal

Certbot

Introducción

Tras añadir certificados en el Ingress de K8s, no era demasiado añadir lo mismo a los servicios web de la Raspberry.

En este caso, Let's Encrypt se gestiona a partir de Certbot vía comandos y también permite el uso de validación con DNS01, lo que no requiere que el servidor sea accesible desde Internet.

Los certificados generados se utilizan en:

Instalación

Antes de instalar, hay que revisar los plugins disponibles para encontrar el válido según nuestro registrador de dominio.

apt-cache search certbot

En mi caso es Cloudflare.

sudo apt install -y certbot python3-certbot-dns-cloudflare
tip

Cada plugin tiene un fichero y argumentos diferentes, así que habrá que ajustar estos comandos según su documentación. Buscar el plugin con apt-cache search certbot para encontrar el correspondiente.

Configuración del plugin

Creo el fichero que contiene el token previamente creado.

sudo mkdir -p /etc/letsencrypt/cloudflare
sudo vi /etc/letsencrypt/cloudflare/cloudflare.ini
/etc/letsencrypt/cloudflare/cloudflare.ini
# Cloudflare API token used by Certbot
dns_cloudflare_api_token = <token>

Protegemos el fichero para que solo root pueda leerlo.

sudo chmod 600 /etc/letsencrypt/cloudflare/cloudflare.ini

Generar certificados

Ejecutamos Certbot con la información del registrador del dominio y el dominio a utilizar.

sudo certbot certonly -n \
--agree-tos \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare/cloudflare.ini \
--dns-cloudflare-propagation-seconds 180 \
-d rasp1.intranet.domain.cat \
-m [email protected]
tip

Por defecto se crean certificados de tipo ECDSA que son válidos con la mayoría de servidores. Si se necesitan certificados RSA por compatibilidad, añadir: --key-type rsa

info

DNS01 puede usar wildcards, así que es posible cambiar rasp1 por * para reutilizar estos certificados en otros servicios del mismo dominio.

Tras un tiempo de espera, se crearán los certificados en /etc/letsencrypt/live/rasp1.intranet.domain.cat/.

Renovación automática

Certbot instala automáticamente un timer de systemd que se encarga de renovar los certificados antes de que expiren. Se puede verificar con:

sudo systemctl list-timers | grep certbot

Para que los servicios apliquen los nuevos certificados tras la renovación, se configura un deploy hook.

sudo vi /etc/letsencrypt/renewal-hooks/deploy/restart-services.sh

Este script se ejecutará automáticamente tras cada renovación exitosa. Actualiza los certificados de Pi-hole y reinicia los servicios que los utilizan.

/etc/letsencrypt/renewal-hooks/deploy/restart-services.sh
#!/bin/bash
DOMAIN="rasp1.intranet.domain.cat"
CERT_PATH="/etc/letsencrypt/live/$DOMAIN"

# Actualizar certificado de Pi-hole
cat "$CERT_PATH/fullchain.pem" "$CERT_PATH/privkey.pem" > /etc/pihole/tls.pem
chmod 600 /etc/pihole/tls.pem
service pihole-FTL restart

# Reiniciar lighttpd (Nagios y métricas)
systemctl restart lighttpd
sudo chmod 700 /etc/letsencrypt/renewal-hooks/deploy/restart-services.sh
aviso

Recordar reiniciar los servicios tras la primera instalación, se puede hacer mediante el anterior script.