Accediendo a OpenHab2 desde el exterior

Controlar OpenHab2 desde cualquier parte del mundo

Llegara 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 articulo.

Bloque Openhab

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

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 utilizada:

cd ..
rm -rf apache-tools

y ejecutamos el comando sustituyendo 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

Modificamos el fichero de configuración del bloque y añadimos las lineas 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;

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

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 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:

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/

Y por último modificamos la configuracion 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; # or /etc/ssl/openhab.crt
    ssl_certificate_key             /etc/letsencrypt/live/oh2.m*******.com/privkey.pem;   # or /etc/ssl/openhab.key

    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;
    }
}

Para terminar comprobamos y reiniciamos:

sudo nginx -t
sudo systemctl restart nginx

Soy Jaume Ferré, aficionado a los nuevas tecnologias, aunque ya no lo son tanto.
¡Gracias por leerme!

Valora este artículo1 2 3 4 5 (0 votos)

(0 votos)

Categorias del blog

twitter

Últimos tweets