Dehydrated is SSL automation for LetsEncrypt certs

January 23, 2019

Dehydrated permite solicitar y renovar de forma automática certificados SSL emitidos gratuitamente por Letsencrypt

Instalación Inicial

Descargaremos dehydrated en nuestro directorio de usuario

cd
git clone https://github.com/lukas2511/dehydrated.git

Crear su directorio de configuración

sudo mkdir /etc/dehydrated
cd /etc/dehydrated/
sudo wget https://github.com/lukas2511/dehydrated/raw/master/docs/examples/config

Activando nuestra instalación.

sudo ~/dehydrated/dehydrated --register --accept-terms

Cumpliendo desafio de autenticación

Para poder validar nuestra petición LetsEncrypt nos presenta un reto de autenticación el cual existe en dos variantes, HTTP y DNS. En nuestro caso elegimos usar HTTP con NGINX porque considero que debe de ser mas complicado lograr tanto la solicitud como la renovacion automatizada usando DNS y Bind

El desafío de autenticación HTTP-01, implica que Letsencrypt hará una petición a un URL determinado en el dominio que queremos cifrar con SSL. Dehydrated, al haber generado la solicitud original conoce la respuesta correcta para la verificación y la puede colocar de forma automática en un URL donde la pueda encontrar los servidores de LetsEncrypt.

Crearemos un directorio donde van a ser respondidas todos los desafíos de autenticación que nos mande LetsEncrypt

sudo mkdir /var/www/dehydrated
sudo chown www-data:www-data /var/www/dehydrated/

Ahora, en la configuración del puerto estándar HTTP 80 de cada dominio activo de NGINX para el cual queramos responder desafíos, agregaremos el siguiente alias que permitira responder a desafíos tanto de forma inicial como para su renovación

location ^~ /.well-known/acme-challenge {
    alias /var/www/dehydrated;
  }

Es importante reniciar NGINX para aplicar todos los cambios anteriores

sudo /etc/init.d/nginx restart

Agregar un nuevo dominio a LetsEncrypt

echo 'secure.my_domain.com' | sudo tee -a /etc/dehydrated/domains.txt

Solicitud inicial de certificado

Por default dehydrated buscará la configuración en /etc/dehydrated/config

sudo ~/dehydrated/dehydrated -c

Si todo sale bien nuestros certificados estarán listos en la siguiente ruta

rene@box:~$ sudo ls -l /etc/dehydrated/certs/secure.my_domain.com
total 28
-rw------- 1 root root 1663 Dec 12 04:54 cert-1544590470.csr
-rw------- 1 root root    0 Dec 12 04:54 cert-1544590470.pem
-rw------- 1 root root 1663 Dec 12 04:58 cert-1544590692.csr
-rw------- 1 root root 2273 Dec 12 04:58 cert-1544590692.pem
lrwxrwxrwx 1 root root   19 Dec 12 04:58 cert.csr -> cert-1544590692.csr
lrwxrwxrwx 1 root root   19 Dec 12 04:58 cert.pem -> cert-1544590692.pem
-rw------- 1 root root 1648 Dec 12 04:58 chain-1544590692.pem
lrwxrwxrwx 1 root root   20 Dec 12 04:58 chain.pem -> chain-1544590692.pem
-rw------- 1 root root 3921 Dec 12 04:58 fullchain-1544590692.pem
lrwxrwxrwx 1 root root   24 Dec 12 04:58 fullchain.pem -> fullchain-1544590692.pem
-rw------- 1 root root 3243 Dec 12 04:54 privkey-1544590470.pem
-rw------- 1 root root 3247 Dec 12 04:58 privkey-1544590692.pem
lrwxrwxrwx 1 root root   22 Dec 12 04:58 privkey.pem -> privkey-1544590692.pem

Ahora, es cuestión de reconfigurar nuestro dominio en nginx para poder servir las peticiones SSL , de hecho iremos un paso mas allá al redireccionar las peticiones al puerto 80 para forzar que todos los clientes usen SSL en nuestro sitio

sudo cat /etc/nginx/sites-enabled/secure
server {

  listen  secure.my_domain.com:80;
  server_namesecure.my_domain.com;

  return 301 https://secure.my_domain.com$request_uri;

  location ^~ /.well-known/acme-challenge {
    alias /var/www/dehydrated;
  }

}

server {
  listen secure.my_domain.com:443 ssl;
  server_namesecure.my_domain.com;

  ssl_certificate /etc/dehydrated/certs/secure.my_domain.com/fullchain.pem;
  ssl_certificate_key /etc/dehydrated/certs/secure.my_domain.com/privkey.pem;

  keepalive_timeout 5;

  root   /var/www/secure.my_domain.com/;

}

Reiniciar NGINX una vez más y la configuración esta lista

Renovación con CRON

Los certificados de Lets Encrypt tienen una vigencia menor a los 3 meses. Para evitar que nuestro certificado expire y para evitar tener que acordarnos de renovarlo manualmente podemos automatizar con cron

crontab -e
 0 5 * * 1 /usr/local/sbin/dehydrated -c -f /etc/dehydrated/config

Ejecutaremos cada primero del mes a las cinco de la mañana.

Finalmente recordemos que LetsEncrypt impone limites a la cantidad de tiempo minima que debemos de dejar pasar entre una petición y otra, para evitar ser bloqueado es recomendable tener cuidado o usar la configuración de staging de dehydrated durante nuestra experimentación !

Comments

comments powered by Disqus