Nginx y Letsencrypt con certbot en docker alpine

ACTUALIZACIÓN 31/08/2020

Tal como señala Nicolas en los comentarios, los repositorios de software de alpine ya incluyen el paquete certbot y puede ser instalado directamente con apk:

apk add certbot certbot-nginx

Post original

En este laboratorio aprenderemos cómo instalar certbot usando la imagen oficial de docker nginx:alpine y usarla para crear un certificado SSL para nuestro dominio. Ten en cuenta que para que funcione, debes ser propietario del dominio para el que necesites el certificado y éste debe resolver a la dirección IP pública donde está expuesto el contenedor docker.

Requisitos

Esta es la parte más complicada cuando se ejecuta certbot en una imagen basada en alpine, para poder instalar el módulo certbot primero tenemos que resolver algunas dependencias. Para ahorrarte la molestia de escribir tu propio Dockerfile, te proporcionamos uno:

FROM nginx:1.20-alpine
RUN apk add python3 python3-dev py3-pip build-base libressl-dev musl-dev libffi-dev rust cargo
RUN pip3 install pip --upgrade
RUN pip3 install certbot-nginx
RUN mkdir /etc/letsencrypt

Probablemente apreciarás que también creamos una carpeta para letsencrypt. Más adelante montaremos un volumen aquí para que los datos de letencrypt sean persistentes y evitaremos perder el certificado cuando eliminemos el contenedor.

Configurando Nginx

La configuración que vamos a usar es muy simple. De hecho, es el archivo default.conf que viene con Nginx, pero primero eliminaremos algunas cosas innecesarias. Así que creamos un archivo llamado «default.conf» y configuramos los siguientes contenidos:
server {
    listen       80;
    server_name  yourdomain.com;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Recuerda reemplazar el valor de server_name con tu propio dominio. Ahora, abre el Dockerfile y agrega una nueva línea al final:

COPY default.conf /etc/nginx/conf.d/default.conf

Construyendo la imagen de Docker

Este paso es fácil y supongo que ya sabes cómo construir un Dockerfile, pero de todos modos aquí está el comando:

docker build -t nginx-certbot .

Crear el nuevo certificado con certbot

Primero, ejecutaremos el contenedor anulando el punto de entrada para ejecutar el shell. También montaremos la carpeta letsencrypt para que los datos del certificado sean persistentes.

Advertencia: también recomendaría montar la carpeta nginx en un volumen persistente, pero eso está fuera del alcance de este laboratorio.

docker run -v $(pwd)/letsencrypt:/etc/letsencrypt --name nginx -ti -p 8080:80 nginx-certbot sh

Luego, ejecutamos el comando certbot reemplazando yourdomain.com con tu dominio real (el mismo que usamos para servername). También ten en cuenta que puedes agregar el dominio www, simplemente agrega un indicador «-d» para cada entrada adicional que necesites en el certificado:

certbot --nginx -d yourdomain.com -d www.yourdomain.com

Ahora certbot nos pedirá una dirección de correo electrónico que se usará para la recuperación y luego intentará verificar que es el propietario del dominio dado. Ten en cuenta que si no se puede acceder a su servidor en este dominio, recibirá un error. Si la verificación del dominio tiene éxito, certbot te preguntará si deseas habilitar la redirección de HTTP a HTTPS en la configuración de nginx. Recomendamos hacerlo.

Finalmente, Nginx se volverá a cargar y deberías recibir un mensaje con la ubicación de tus certificados. Ahora, puedes hacer una copia de seguridad de estos certificados si lo deseas.

Automatizar la renovación del certificado

Si no deseamos verificar y renovar manualmente estos certificados cuando se acerquen a la fecha de vencimiento, agregaremos un trabajo cron para que lo haga por nosotros:

0 12 * * * /usr/bin/certbot renew --quiet

Conclusión

Como puedes ver, no ha sido tan difícil crear los certificados SSL para tu dominio usando certbot.

Elegimos alpine docker image para este laboratorio porque probablemente es una de las imágenes base más problemáticas para usar junto con certbot, nosotros tuvimos algunos problemas para que funcionara correctamente debido a problemas de dependencias. Si eliges una imagen basada en ubuntu, probablemente será mucho más fácil configurar certbot, pero el punto es que las imágenes alpine son una opción habitual debido a su naturaleza minimalista.

Espero que hayas disfrutado este laboratorio. No dudes en contactarnos si deseas que te ayudemos en tus proyectos.

¡Nos vemos en la próxima entrada! Feel the Geko way!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *