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:
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í:
Si hay alguna duda o consulta, no dudes en dejar un comentario.