Hola a todos de nuevo. En esta ocasión, vamos a enseñar cómo implementar DuckDNS + LetsEncrypt para obtener un servicio DNS gratuito (similar a No-Ip) y certificados firmados para mejorar la seguridad de nuestra conexión a Home Assistant desde fuera.
Lo primero de todo nos tenemos que dirigir a esta página y registrar una cuenta con un nombre de dominio. El resto del tutorial lo voy a seguir como myhome como nombre de dominio.
Lo siguiente que debemos hacer es seguir las instrucciones para que nuestro sistema actualice automáticamente nuestra dirección IP externa con el servidor DuckDNS. Puedes encontrar estas instrucciones en este enlace.
Una vez hayamos completado los pasos anteriores, debemos acceder a la configuración de nuestro enrutador y abrir el puerto que deseamos, redirigiéndolo internamente a la dirección IP de nuestra Raspberry Pi o sistema en el que esté instalado nuestro Home Assistant.
Antes de proceder, es importante realizar una prueba asegurándonos de que al ingresar la dirección http://myhome.duckdns.org:puerto en un navegador, podamos acceder correctamente a nuestro Home Assistant.
Una vez confirmado que todo está probado y funcionando correctamente, podemos continuar con el tutorial.
Si no tienes instalada la dependencia GIT, puedes instalarla ejecutando el siguiente comando en tu sistema:
1 |
sudo apt-get install git |
Este comando instalará GIT en tu sistema para que puedas seguir con el proceso de configuración de DuckDNS y Let's Encrypt.
A continuación deberemos estar como nuestro usuario homeassistant (sudo su -s /bin/bash homeassistant), en su mismo home clonaremos un archivo git con este comando:
1 |
git clone https://github.com/lukas2511/dehydrated.git |
Dirígete al directorio generado en /home/homeassistant/dehydrated y crea un archivo llamado domains.txt. En el interior de este archivo, escribe el dominio de DuckDNS que tienes asignado, por ejemplo: myhome.duckdns.org, y guarda los cambios.
Lo siguiente es crear un archivo config sin extension y dentro de el tendra que contener:
1 2 3 4 5 |
# Which challenge should be used? Currently http-01 and dns-01 are supported CHALLENGETYPE="dns-01" # Script to execute the DNS challenge and run after cert generation HOOK="${BASEDIR}/hook.sh" |
Después de copiar el texto anterior, guarda el archivo. Luego, en la misma carpeta, crea un archivo llamado hook.sh y pega el siguiente contenido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/usr/bin/env bash set -e set -u set -o pipefail domain="myhome" token="your-duckdns-token" case "$1" in "deploy_challenge") curl "https://www.duckdns.org/update?domains=$domain&token=$token&txt=$4" echo ;; "clean_challenge") curl "https://www.duckdns.org/update?domains=$domain&token=$token&txt=removed&clear=true" echo ;; "deploy_cert") sudo systemctl restart home-assistant@homeassistant.service ;; "unchanged_cert") ;; "startup_hook") ;; "exit_hook") ;; *) echo Unknown hook "${1}" exit 0 ;; esac |
Los valores en domain y token que están marcados en rojo deben ser reemplazados por tu propio dominio (sin .duckdns.org) y tu token proporcionado por DuckDNS respectivamente. Una vez hecho esto, guarda el archivo.
Haremos que el archivo anterior (hook.sh) sea ejecutable:
1 |
chmod 755 hook.sh |
Una vez alcanzado este punto, procederemos a generar los certificados necesarios para implementar HTTPS en nuestro Home Assistant.
1º Registraremos una nueva clave privada con letsencrypt:
1 |
./dehydrated --register --accept-terms |
Una vez realizado este paso debería darnos en la consola: Done!
2º Generaríamos el certificado:
1 |
./dehydrated -c |
En este último paso, se nos solicitará la contraseña de root del usuario Home Assistant. Para evitar este paso, podemos omitirlo presionando Ctrl+C y el proceso estará completo.
Es importante recordar que los certificados Let's Encrypt tienen una validez de 90 días. Para evitar la caducidad, necesitaremos configurar la renovación automática. Para ello, debemos agregar una tarea al servicio cron del sistema que renueve los certificados diariamente. Podemos acceder al cron con el siguiente comando:
1 |
crontab -e |
Al final del archivo pegaríamos lo siguiente:
1 |
0 1 1 * * /home/homeassistant/dehydrated/dehydrated -c |
guardaríamos los cambios. Una vez llegados a este punto ya solo tendríamos que entrar en el archivo configuration.yaml de nuestro HA y rellenar el apartado de http:
1 2 3 4 5 6 7 8 9 |
http: api_password: xxxxxx ssl_certificate: /home/homeassistant/dehydrated/certs/myhome.duckdns.org/fullchain.pem ssl_key: /home/homeassistant/dehydrated/certs/myhome.duckdns.org/privkey.pem base_url: https://myhome.duckdns.org:8123 |
Lo marcado en rojo como ya vamos diciendo, deberemos modificarlo por nuestro dominio.
Finalmente reseteariamos nuestro HA:
1 |
sudo systemctl restart home-assistant@homeassistant.service |
Nuestro HA debería ser accesible vía: https://myhome.duckdns.org:8123