Acceder a OpenHAB desde exterior con Nginx y SSL

OpenHAB accesible desde exterior con Nginx y SSL
3 min. Lectura
0 Vistas
0 Valoración

Llegará un momento, y esto lo aseguro, que todo lo que estamos haciendo vamos a querer tener acceso desde fuera de casa. Pero eso conlleva un enorme peligro como podemos adivinar.

Hay varias soluciones, yo he escogido la de utilizar Nginx que deberíamos tener ya instalado y funcionando. Si todavía no lo tienes, ahora es el momento de leer este artículo.

Bloque OpenHAB en Nginx

Creamos el fichero correspondiente al bloque de OpenHAB, siguiendo la misma estructura que vimos en los bloques de servidores de Nginx:

sudo nano /etc/nginx/sites-available/openhab
server {
    listen                                    80;
    server_name                               mydomain_or_myip;

    location / {
        proxy_pass                            http://localhost:8080/;
        proxy_set_header Host                 $http_host;
        proxy_set_header X-Real-IP            $remote_addr;
        proxy_set_header X-Forwarded-For      $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto    $scheme;
    }
}

Creamos el enlace simbólico en sites-enabled:

sudo ln -s /etc/nginx/sites-available/openhab /etc/nginx/sites-enabled

Y reiniciamos el servicio:

sudo systemctl restart nginx

Configurar autenticación básica

Vamos a querer utilizar un usuario y una palabra de paso para podernos conectar en remoto. Utilizaremos htpasswd que se encuentra en el paquete apache-tools en AUR. Lo instalamos:

git clone https://aur.archlinux.org/apache-tools.git
cd apache-tools
makepkg -si

Una vez instalado, borramos la carpeta que hemos utilizado:

cd ..
rm -rf apache-tools

Y ejecutamos el comando sustituyendo username por el usuario que queremos autentificar:

sudo htpasswd -c /etc/nginx/.htpasswd username

Nos pedirá una palabra de paso y su verificación:

New password:
Re-type new password:
Adding password for user username

Añadir autenticación al bloque

Modificamos el fichero de configuración del bloque y añadimos las líneas siguientes a continuación de las del proxy:

sudo nano /etc/nginx/sites-available/openhab
auth_basic                            "Username and Password Required";
auth_basic_user_file                  /etc/nginx/.htpasswd;

Gestión de usuarios

Importante: Para agregar nuevos usuarios, usaremos el siguiente comando. No hay que usar el parámetro -c nuevamente ya que esto eliminará todos los usuarios creados con anterioridad:

sudo htpasswd /etc/nginx/.htpasswd username

Y para eliminar un usuario existente:

sudo htpasswd -D /etc/nginx/.htpasswd username

Reiniciamos el servicio:

sudo systemctl restart nginx

Añadiendo SSL con Let's Encrypt

Podemos seguir la guía que hice en su momento aquí, pero teniendo en cuenta lo siguiente:

Necesitamos un directorio al que Certbot pueda tener acceso. Voy a seguir la misma organización en las rutas que estoy utilizando en la parte servidor web:

sudo mkdir -p /srv/http/openhab/public_html
sudo chown -R http:http /srv/http/openhab/public_html
sudo chmod g+w /srv/http/

Añadimos en el fichero de configuración:

sudo nano /etc/nginx/sites-available/openhab
    location /.well-known/acme-challenge/ {
        root                                  /srv/http/openhab/public_html;
    }

Y ejecutamos Certbot:

sudo certbot certonly --webroot
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): oh2.m********.com

Input the webroot for oh2.m*********.com: (Enter 'c' to cancel): /srv/http/openhab/public_html/

Configuración final con HTTPS

Y por último modificamos la configuración de Nginx:

sudo nano /etc/nginx/sites-available/openhab

Actualización Enero 2021 para OpenHAB 3:

server {
   listen                          80;
   server_name                     oh2.m*******.com oh2.rpi4.test;
   return 301                      https://$server_name$request_uri;
}

## Reverse Proxy to openHAB
server {
    listen                          443 ssl;
    server_name                     oh2.m*******.com oh2.rpi4.test;
    add_header                      Strict-Transport-Security "max-age=31536000; includeSubDomains";

    # Cross-Origin Resource Sharing.
    add_header 'Access-Control-Allow-Origin' '*' always; # make sure that also a 400 response works
    add_header 'Access-Control-Allow_Credentials' 'true' always;
    add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range' always;
    add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH' always;
    add_header Set-Cookie X-OPENHAB-AUTH-HEADER=1;

    ## Secure Certificate Locations
    ssl_certificate                 /etc/letsencrypt/live/oh2.m*******.com/fullchain.pem;
    ssl_certificate_key             /etc/letsencrypt/live/oh2.m*******.com/privkey.pem;

    location / {
        proxy_pass                              http://localhost:8080/;
        proxy_set_header Host                   $http_host;
        proxy_set_header X-Real-IP              $remote_addr;
        proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto      $scheme;
        proxy_set_header Authorization "";
        proxy_read_timeout 3600;

        ## Password Protection
        auth_basic                              "Username and Password Required";
        auth_basic_user_file                    /etc/nginx/.htpasswd;
    }
}

Verificar y aplicar cambios

Para terminar comprobamos la configuración y reiniciamos:

sudo nginx -t
sudo systemctl restart nginx

Con esta configuración ya puedes acceder a tu OpenHAB de forma segura desde cualquier lugar con:

  • ✅ Conexión HTTPS cifrada
  • ✅ Autenticación con usuario y contraseña
  • ✅ Redirección automática de HTTP a HTTPS
  • ✅ Headers de seguridad configurados

¿Te ha sido útil?

Ayúdame a mejorar con tu puntuación y comentarios.

0.0 (0 votos)
Jaume Ferré

Jaume Ferré

Soy un entusiasta de las nuevas tecnologías, apasionado por explorar su potencial innovador. Colecciono CDs en formato físico y disfruto creando mezclas musicales. Además, la fotografía es otra de mis pasiones, capturando momentos y expresiones con cada disparo. ¡Gracias por leerme!

💬 Comentarios

Los comentarios están gestionados por GitHub Discussions. Necesitas una cuenta de GitHub para participar. ¡Es gratis y rápido!