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 !