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:
- Pi-hole (puerto 443)
- Lighttpd para Nagios (puerto 444)
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
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
# 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]
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
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.
#!/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
Recordar reiniciar los servicios tras la primera instalación, se puede hacer mediante el anterior script.