Cómo configurar certificados auto firmados o de terceros en Traefik

Cómo configurar certificados auto firmados o de terceros en Traefik

En este artículo vamos a ver como configurar Traefik para que soporte certificados auto firmados o de terceros como Comodo, Verisign, etc.

No siempre podemos utilizar certificados de Let's Encrypt, porque el negocio requiere que utilicemos un certificado comercial si o si o que cumpla con determinadas características que los mencionados no cumplen.

Así que te mostraré cómo configurar Traefik y el contenedor, para que el mismo tenga un certificado auto firmado o de terceros.

A configurar

Primero, lo que debemos hacer es obtener el certificado y la llave privada. Con eso, podemos seguir adelante con la configuración.

Si estás haciendo alguna prueba y querés un certificado "auto firmado", desde este sitio podés generar uno rápidamente:

Self-Signed Certificate Generator
Generate a self-signed certificate for your web site.

Luego, vamos a generar un archivo de configuración de Traefik que llamaremos certificates.toml

$ vim certificates.toml

Este archivo tendrá como contenido las rutas donde estará el certificado y la llave privada dentro del contenedor.

[[tls.certificates]] #nuestro certificado
   certFile = "/configuration/hello.cduser.com.cert" 
   keyFile = "/configuration/hello.cduser.com.key"

Noten que esta ruta es una carpeta que vamos a montar como volumen del contenedor más adelante. Noten también que hay un parámetro y los valores están entre comillas, así se deben mantener. Otra cosa importante es que el CN (Common Name) de nuestros certificados tienen que matchear con la URL que le especifiquemos al contenedor en las labels de Traefik. Más adelante se entenderá un poco mejor.

Una vez que tenemos ese archivo listo, procedemos a revisar la configuración de Traefik. Esto es un docker-compose.yml como ya hemos visto en varias oportunidades, pero con unas diferencias. Por ejemplo, la parte de Let's Encrypt que no la necesitamos, voló.

services:
  traefik:
    container_name: traefik
    image: "traefik:v2.2"
    command:
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --providers.docker
      - --api
      - --log.level=ERROR
      - --providers.file.directory=/configuration/
      - --providers.file.watch=true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "/path/to/configuration/:/configuration/"
    labels:
      - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
      - "traefik.http.routers.http-catchall.entrypoints=web"
      - "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

Lo importante de este compose, son los siguientes comandos:

     - --providers.file.directory=/configuration/

En este comando, vamos a especificar un directorio que está dentro del contenedor y es donde vamos a montar nuestra carpeta local llamada configuration en la cual tiramos el archivo certificates.toml que creamos más arriba.

Lo otro importante es el montaje del volumen de esa carpeta local llamada configuration o cualquier otro nombre que hayan elegido. La misma carpeta, la vamos a montar en una carpeta en el contenedor, también llamada configuration.

      - "/path/to/configuration/:/configuration/"

Una vez que tenemos esto pronto, podemos guardar y ejecutar...

$ docker-compose up -d

El resultado, lo podremos ver ejecutando...

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES
68a33787891f        traefik:v2.2        "/entrypoint.sh --en…"   3 hours ago         Up 3 hours          0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   traefik

Ahora bien, nuestro reverse proxy está corriendo, ahora, configuremos un contenedor con las labels de Traefik para que pueda usar ese certificado que guardamos en .../configuration.

Spinning a container

Vamos a hacerlo sencillo, vamos a desplegar un hello-world. Para eso, tengo este docker-compose.yml

services: 
  hello_world:
    image: tutum/hello-world
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.hello.rule=Host(`hello.cduser.com`)"
      - "traefik.http.routers.hello.tls=true"
      - "traefik.http.routers.hello.entrypoints=websecure"

Veamos que le configure el Host, que tiene una URL y acá es importante, que en el common name del certificado, tiene que estar esta URL para que Traefik solito haga el match y asocie este contenedor a ese certificado.

También le decimos que la configuración de este contenedor para TLS es true y por último le decimos que el entrypoint es websecure, de esa manera, la única manera de entrar es a través de https.

Ejecutamos...

$ docker-compose up -d

Después de que arrancó el contenedor y visitando la URL configurada, en mi caso, hello.cduser.com, veo que va solo hacia https y carga el certificado.

Noten que dice que no es de confianza, ya que es un certificado auto firmado.

Para ir cerrando

Como ves, no es para nada complicado, espero que esta guía te aporte en algo.

Por acá les dejo el enlace a mi repo de Github para que puedan descargar el compose completo y arrancar desde ahí:

xe-nvdk/awesome-docker
Repository to save docker recipes. Mostly docker-compose format. - xe-nvdk/awesome-docker

Si hay alguna duda o consulta, no dudes en dejar un comentario.