Certificados Letsencrypt para tu servidor mediante docker

6 minutos de lectura

En el articulo de hoy vamos a ver como utilizar un contenedor docker para generar y actualizar de forma automática los certificados que nos proporciona Letsencript de forma gratuita para nuestros nombres de subdominios obtenidos en Duckdns y que podemos utilizar para diferentes servicios en nuestro servidor mediante un proxy inverso, como veremos en próximos artículos.

Instalación

Voy a utilizar la imagen que proporciona Linuxserver en el hub de Docker, en la seccion Dockers, buscamos por letsencrypt

Una vez seleccionado si pulsamos sobre el icono de información,

Nos llevará a la página web de la imagen, donde podemos ver las tags de las arquitecturas soportadas, en mi caso, para mi placa, pondré arm64 como tag y pulso en el botón Comenzar

Abrir puertos en el router

Para poder obtener o renovar los certificado es necesario abrir los puertos 443 y 80 del router y redirigirlos a los puertos de escucha del docker, en mi caso como los purtos 80 y 443 los utilizo para otros servicios, redirigire los puertos al 1443 y 180 del docker.

Configuración

Cuando termine la descarga de la imagen, seleccionamos la imagen y pulsamos en el botón Ejecutar imagen

Ahora pasamos a configurar el contenedor

  • 1: Nombre que le vamos a dar al contenedor

  • 2: always, si queremos que se inicie de forma automatice

  • 3: bridge, ya que vamos realiar NAT en el puerto 80 y 443

  • 4: nombre host del servidor (ngnix) que corre en la imagen

  • 5: vamos a indicarle al docker que todas las peticiones que lleguen por el puerto 1443 (https) y 180 (http), tendremos que hacer NAT desde el router, los redirija a los puertos 443 y 80, respectivamente. del contenedor

  • 6: http

  • 7: zona horaria que corresponda, en mi caso Europe/Madrid

  • 8: nombre del subdominio de duckdns del certificado que vayas a crear/renovar, si utilizas más de un subdominio, deben de ir separados por comas y sin espacios, por ejemplo subdominio1,subdominio2,subdominio3 ( /cuidado no es subdominio1.duckdns.org, solo el nombre de subdominio / )

  • 9: GID del usuario que ejecuta el docker (abre una terminal en el servidor y ejecuta el comando id)

  • 10: pondremos el token de nuestra cuenta, aquí te explico como obtenerlo.

  • 11: el id del usuario que ejecuta el docker.

  • 12: duckdns.org

  • 13: email para poder recibir las notificaciones desde Letsencript, por ejemplo cuando vaya a caducar el certificado

  • 14: true

  • 15: Es conveniente que te crees una carpeta compartida donde almacenar los certificados, asi en un futuro sera mas fácil acceder a ellos

  • 16: –cap-add=NET-ADMIN, creamos una nueva interfaz de red para el docker

Para finalizar pulsamos en el botón Salvar

Podemos mirar el log para comprobar que ha arrancado correctamente, bien abriendo una terminal

  1carlos@rockpro64:~ $ sudo docker logs -f letsencrypt
  2[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
  3[s6-init] ensuring user provided files have correct perms...exited 0.
  4[fix-attrs.d] applying ownership & permissions fixes...
  5[fix-attrs.d] done.
  6[cont-init.d] executing container initialization scripts...
  7[cont-init.d] 10-adduser: executing...
  8
  9-------------------------------------
 10          _         ()
 11         | |  ___   _    __
 12         | | / __| | |  /  \
 13         | | \__ \ | | | () |
 14         |_| |___/ |_|  \__/
 15
 16
 17Brought to you by linuxserver.io
 18We gratefully accept donations at:
 19https://www.linuxserver.io/donate/
 20-------------------------------------
 21GID/UID
 22-------------------------------------
 23
 24User uid:    1000
 25User gid:    100
 26-------------------------------------
 27
 28[cont-init.d] 10-adduser: exited 0.
 29[cont-init.d] 20-config: executing...
 30[cont-init.d] 20-config: exited 0.
 31[cont-init.d] 30-keygen: executing...
 32generating self-signed keys in /config/keys, you can replace these with your own keys if required
 33Generating a RSA private key
 34.+++++
 35............................................................................................+++++
 36writing new private key to '/config/keys/cert.key'
 37-----
 38[cont-init.d] 30-keygen: exited 0.
 39[cont-init.d] 50-config: executing...
 40Variables set:
 41PUID=1000
 42PGID=100
 43TZ=Europe/Madrid
 44URL=dominio.duckdns.org
 45SUBDOMAINS=
 46EXTRA_DOMAINS=
 47ONLY_SUBDOMAINS=false
 48DHLEVEL=2048
 49VALIDATION=duckdns
 50DNSPLUGIN=
 51EMAIL=xxxxxx@mail.com
 52STAGING=
 53
 54Created donoteditthisfile.conf
 55Creating DH parameters for additional security. This may take a very long time. There will be another message once this process is completed
 56Generating DH parameters, 2048 bit long safe prime, generator 2
 57This is going to take a long time
 58.....+......................................................+......................................+...................+.........+.....................................................................................+..........................................................................+......................................+.....................................................................................+.................................................................................................................+..+..................+............................................................................................................+..............................................................................................................................+.............+..+........................................................................................................................................................................................................+............................................................+.........................................+................................................................+........+.+....+.......................................................................................................................................+..........................................+...................................+........................+........................+.......................................................................+...........................................................................................................................................+......................+........................................................................................................................................................+.............................................................................+.....................................................................................................................................................................................................++*++*++*++*
 59DH parameters successfully created - 2048 bits
 60No subdomains defined
 61E-mail address entered: xxxxx@mail.com
 62duckdns validation is selected
 63the resulting certificate will only cover the subdomains due to a limitation of duckdns, so it is advised to set the root location to use www.subdomain.duckdns.org
 64Generating new certificate
 65Saving debug log to /var/log/letsencrypt/letsencrypt.log
 66Plugins selected: Authenticator manual, Installer None
 67Obtaining a new certificate
 68Performing the following challenges:
 69dns-01 challenge for dominio.duckdns.org
 70Output from duckdns-txt:
 71OKsleeping 60
 72
 73Error output from duckdns-txt:
 74  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
 75                                 Dload  Upload   Total   Spent    Left  Speed
 76
 77  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
 78  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
 79100     2    0     2    0     0      2      0 --:--:-- --:--:-- --:--:--     2
 80
 81Waiting for verification...
 82Cleaning up challenges
 83IMPORTANT NOTES:
 84 - Congratulations! Your certificate and chain have been saved at:
 85   /etc/letsencrypt/live/dominio.duckdns.org/fullchain.pem
 86   Your key file has been saved at:
 87   /etc/letsencrypt/live/dominio.duckdns.org/privkey.pem
 88   Your cert will expire on 2019-05-03. To obtain a new or tweaked
 89   version of this certificate in the future, simply run certbot
 90   again. To non-interactively renew *all* of your certificates, run
 91   "certbot renew"
 92 - Your account credentials have been saved in your Certbot
 93   configuration directory at /etc/letsencrypt. You should make a
 94   secure backup of this folder now. This configuration directory will
 95   also contain certificates and private keys obtained by Certbot so
 96   making regular backups of this folder is ideal.
 97 - If you like Certbot, please consider supporting our work by:
 98
 99   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
100   Donating to EFF:                    https://eff.org/donate-le
101
102New certificate generated; starting nginx
103[cont-init.d] 50-config: exited 0.
104[cont-init.d] done.
105[services.d] starting services
106[services.d] done.
107Server ready

Comprobación

Ahora deberías poder acceder a tu nombre de subdominio

Podemos comprobar la fortaleza de nuesrtro sitios desde https://www.ssllabs.com/ssltest/

Desde la terminal

Si no utilizas OpenMediaVault o si lo utilizas y prefieres crear el contenedor mediante la terminal, te dejo el comando completo:

 1
 2docker create \
 3  --name=letsencrypt \
 4  --cap-add=NET_ADMIN \
 5  -e PUID=1000 \
 6  -e PGID=100 \
 7  -e TZ=Europe/Madrid \
 8  -e URL=duckdns.org \
 9  -e SUBDOMAINS=dominio1,dominio2,dominio3 \
10  -e VALIDATION=http \
11  -e DNSPLUGIN=cloudflare  \
12  -e DUCKDNSTOKEN=token de duckdns  \
13  -e EMAIL=correo0@electronico.com  \
14  -e DHLEVEL=2048  \
15  -e ONLY_SUBDOMAINS=true  \
16  -p 1443:443 \
17  -p 180:80  \
18  -v /mnt/datos/Docker/Config/letsencrypt/:/config \
19  --restart always \
20  linuxserver/letsencrypt:arm64v8-latest

Cambia la etiqueta (tag) arm64v8-latest por la arquitectura de tu equipo

Espero que te haya gustado, pasa un buen día.