Notxor tiene un blog

Defenestrando la vida

Renovación de los certificados web con dehydrated

2020-05-17

En estos días caducaban las claves SSL de la página web, tanto de la matriz Nueva Actitud como de este blog. Y como muchos sabréis, desde hace tiempo vengo utilizando los certificados de Let's encrypt y aunque es un proceso un poco tedioso, no es un proceso complicado. El problema que me encontré es que la herramienta que venía utilizando falló. Tenía que encontrar una nueva, y ahí di con otro problema: todas las herramientas vienen preparadas o, al menos, explicadas para funcionar en situaciones en que el usuario tiene acceso root al servidor. En mi caso no es así, el sitio está subido a un hosting al que sólo puedo acceder como usuario. La herramienta que venía utilizando hasta ahora me permitía generar los certificados de una manera sencilla y sin complicaciones, incluso me había hecho un script con las diferentes llamadas, para generar todos los certificados que necesito de forma automática, pero cuando fui a hacerlo el otro día todo falló y me quedé colgado. Dicha herramienta, está desarrollada en Python y un cambio en el servidor con las versiones de las librerías de dicho lenguaje, la dejó fuera de combate en el momento más inoportuno. Probé a instalar una versión más moderna, pero el problema persistía. Temporalmente lo solucioné como pude para salir del paso y me puse a averiguar cómo dar una solución más a largo plazo, llevo unos días investigando cómo volver a los certificados de Let's encrypt y mirando y contrastando varias herramientas. No voy a contar todas las herramientas que hay: decenas, por no decir centenares y no encontraba ninguna que se pudiera ajustar a mis necesidades.

Finalmente, un amigo del IRC, Deesix, me comentó que él usa Dehydrated, una herramienta desarrollada en bash y que podría serme útil, sobre todo porque no depende de ninguna librería intermedia. La verdad es que tenía razón y me sirve. El problema que me he encontrado es la falta de documentación de la misma: no hay una guía clara de cómo funciona o qué hay que hacer para generar los certificados. Así pues, mediante la técnica del ensayo y error he llegado a generar los certificados que necesito. Lo escribo aquí porque estas cosas se hacen cada tres meses y supongo que para la próxima ya habré olvidado todo lo que hice en estos días de experimentación para terminar generando los certificados, además: no todo lo que he hecho averiguando cómo funciona el chismático, es necesario para generarlos. Y aquí estoy, en el blog, contándole al mí mismo de dentro de tres meses lo que hay que hacer. Y de paso dejándolo aquí por si a alguien le puede ser útil.

Antes de empezar

Lo primero es descargar la herramienta y yo lo hice de su repositorio git:

cd proyectos
git clone https://github.com/dehydrated-io/dehydrated.git

Con la descarga en el directorio doc vienen unos documentos en markdown donde se explican algunos aspectos de la herramienta. Sin embargo, están sueltos, sin orden y tampoco proporcionan una guía clara de cómo conseguir tus certificados.

En todo caso, como muchas de estas herramientas, está todo pensado para funcionar desde el mismo lugar donde se encuentra el contenido de la página, así que mediante ssh lo copié al servidor y lo metí en un directorio creado precisamente para gestionar los certificados. Es un script en bash aunque en su página afirman que es compatible también con zsh.

El fichero config

Para funcionar, dehydrated pide un fichero config donde podemos configurar los diferentes parámetros de nuestros certificados y también de todo el proceso.

En este caso, la única variable que me ha resultado interesante configurar es la siguiente:

WELLKNOWN="public_html/.well-known/acme-challenge"

Esa variable indica el directorio, relativo, donde se almacenará el contenido de comprobación para el challenge http, que le demuestra a la entidad certificadora que nosotros somos los propietarios del sitio. Para quien no lo sepa, dicho challenge consiste en escribir un fichero de texto con un determinado hash que se pude comprobar desde fuera del sitio. Es decir, la herramienta debe escribir desde el interior del propio servidor una etiqueta que estará accesible desde el acceso público para que la entidad certificadora compruebe que el sitio pertenece a quien ha pedido generar los certificados.

Generar certificados

Una vez preparado el tema de la instalación, necesitas una clave de cuenta de Let's encrypt, si nunca has utilizado esta entidad certificadora o, por el motivo que sea, no tienes dicha clave, hay que generarla. El comando es:

./dehydrated --register --accept-terms -d nombre-del-sitio.com

Donde nombre-del-sitio.com debe ser sustituido por la dirección para la que deseamos realizar los certificados. Cuando el comando termina, veremos que ha creado un directorio accounts y dentro encontraremos varios ficheros entre los que se encuentra nuestra clave de cuenta. El directorio donde están tiene un nombre bastante raro y lo podemos renombrar, si queremos, a algo más manejable como nombre-del-sitio. Esto es de lo poco que saqué en claro de la documentación que viene con la herramienta. Porque en mi caso, como ya tenía de antes, clave de cuenta para este mismo sitio, he utilizado la antigua para generar los certificados.

Generar los certificados para el sitio

Para el sitio necesitas un certificado, pero es posible que el mismo pueda tener dos nombres o alias, como por ejemplo:

  • nombre-sitio.com y
  • www.nombre-sitio.com

En la documentación hablan de otro fichero donde podemos guardar esos datos, domains.txt, sin embargo, no he sido capaz de que lo leyera de forma correcta, porque no lo encontraba. Así pues, lo he obviado y los nombres de los sitios se los digo en la línea de comandos.

Hay que recordar que es importante que la variable WELLKOWN esté bien configurada en una dirección que sea accesible desde http. En este caso, el directorio configurado. En nuestro caso ese directorio que hemos configurado como public_html/.well-known/acme-challenge se convertirá en www.nombre-sitio.com/.well-known/acme-challenge desde fuera.

./dehydrated -c -p accounts/nombre-sitio/account_key.pem -f ./config -d nombre-sitio.com -d www.nombre-sitio.com

Con este comando, el proceso se pone en marcha. Tarda algún tiempo en terminar todo el trabajo, conectar con el servidor de claves, identificarse, pedir que se generen claves nuevas, etc. Un poco de paciencia, no es inmediato, pero tampoco se lleva una mañana de espera.

Terminado el proceso, la herramienta habrá creado dos directorios nuevos: certs y chains. El segundo podemos ignorarlo, porque no nos afecta. El primero almacenará dentro un directorio con el nombre del sitio y los certificados generados:

$ ls -la
total 28
drwx------ 2 uxxxxxxxxx oxxxxxxxx 4096 may 17 09:53 .
drwx------ 5 uxxxxxxxxx oxxxxxxxx 4096 may 17 10:14 ..
-rw------- 1 uxxxxxxxxx oxxxxxxxx 1691 may 17 09:44 cert-1589708685.csr
-rw------- 1 uxxxxxxxxx oxxxxxxxx 2297 may 17 09:53 cert-1589708685.pem
lrwxrwxrwx 1 uxxxxxxxxx oxxxxxxxx   19 may 17 09:53 cert.csr -> cert-1589708685.csr
lrwxrwxrwx 1 uxxxxxxxxx oxxxxxxxx   19 may 17 09:53 cert.pem -> cert-1589708685.pem
-rw------- 1 uxxxxxxxxx oxxxxxxxx 1648 may 17 09:53 chain-1589708685.pem
lrwxrwxrwx 1 uxxxxxxxxx oxxxxxxxx   20 may 17 09:53 chain.pem -> chain-1589708685.pem
-rw------- 1 uxxxxxxxxx oxxxxxxxx 3945 may 17 09:53 fullchain-1589708685.pem
lrwxrwxrwx 1 uxxxxxxxxx oxxxxxxxx   24 may 17 09:53 fullchain.pem -> fullchain-1589708685.pem
-rw------- 1 uxxxxxxxxx oxxxxxxxx 3243 may 17 09:44 privkey-1589708685.pem
lrwxrwxrwx 1 uxxxxxxxxx oxxxxxxxx   22 may 17 09:53 privkey.pem -> privkey-1589708685.pem

Como se puede apreciar, algunos de ellos son enlaces a otros presentes en el mismo directorio.

Subir los certificados al sitio

En mi caso, el proveedor del hosting tiene un formulario donde subir los certificados que acabamos de generar. En concreto, dicho formulario para subir los certificados SSL pide tres tipos de datos:

  • Certificado (CRT): En nuestro caso corresponde al contenido de cert.pem.
  • Clave privada (KEY): En nuestro caso corresponde con el contenido privkey.pem.
  • Paquete de certificado de autoridad (CABUNDLE): En nuestro caso corresponde con el contenido de fullchain.pen.

En todos los casos hay que recodar que hay que copiar todo el contenido incluyendo las líneas de inicio y fin de contenido:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

Conclusión

Puede parecer poca cosa lo que aquí cuento. El problema fundamental ha sido la falta de documentación clara.

Al final, el resultado ha sido satisfactorio pero ha costado bastantes pruebas intermedias hacerme con la herramienta. Dejo aquí el resumen para recordarlo dentro de tres meses y por si a alguien le viene bien el tema.

Si estabas buscando una herramienta sencilla, que funcione y que te proporcione los certificados SSL que necesitas, dehydrated puede ser tu herramienta.

Categoría: SSL varios

Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, he decidido no proporcionar dicha opción en el Blog. Si alguien quiere comentar algo, me puede encontrar en Mastodon y en Diaspora con el nick de Notxor.

También se ha abierto un grupo en Telegram, para usuarios de esa red.

Disculpen las molestias.