Renovación de los certificados web con dehydrated
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
ywww.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.