Guida: accedere dall'esterno ad Home Assistant via https con un certificato SSL valido

Leggi questo articolo grazie alle donazioni di Roberto Vazzoler, Daniele Mora, Luciano Meringolo, Salvatore Coppola, Fabio Biondi, Davide Monti, Enrico Valzano.
♥ Partecipa anche tu alle donazioni: sostieni SaggiaMente, sostieni le tue passioni!

Dopo una lunga attesa dovuta ai numerosi impegni, finalmente due giorni fa ho trovato mezz'ora per installare anche io Home Assistant sul Raspberry Pi 3, seguendo proprio la guida che abbiamo pubblicato il mese scorso. Il tutto è stato molto semplice ed indolore, tant'è che ho pensato: chissà perché si dice che questo sistema sia ostico. Ebbene: ho parlato troppo presto. Il giorno dopo sono letteralmente impazzito perché non riuscivo ad agganciarmi al gateway di Xiaomi, finché la notte non ho capito il problema: i due stavano nella stessa rete ma mentre il Raspberry era collegato direttamente al modem TIM con il cavo, il gateway ci arrivava tramite il Wi-Fi di un access point... ho risolto collegandoli entrambi a quest'ultimo. Il terzo giorno un altro problema: attivare un accesso dall'esterno con una connessione ad IP dinamico. Un gioco da ragazzi sulla carta ed effettivamente lo è... se tutto scorre liscio. Questi primi giorni con Home Assistant mi hanno fatto apprezzare un sistema molto duttile e scalabile ma anche un po' fragile e con strumenti di debug non proprio ottimali. La community online è discretamente florida ma facendo ricerche si trova tutto e il contrario di tutto, infatti per ottenere un certificato SSL e configurare l'accesso dall'esterno ci ho impiegato più del previsto. Vediamo dunque i passaggi principali con alcuni degli errori più frequenti, iniziando col rispondere ad una domanda: perché serve configurare un accesso remoto?

Uno dei principali motivi è quello di poter controllare la nostra "smarthome" dall'esterno, sia tramite browser che dall'app, la quale richiede un indirizzo specifico che non può essere risolto nel caso in cui si possegga una connessione ad internet tradizionale, nella quale l'IP fornito dal provider non è sempre lo stesso. A risolvere questo problema ci pensano gli innumerevoli servizi di DynamicDNS e il più pratico da usare con Home Assistant è DuckDNS.

Abilitare e configurare Duck DNS

Dal menu laterale si accede ad Hass.io e da qui al tab "add-on store". Nell'elenco di quelli principali si trova il componente Duck DNS e cliccandoci sopra si può installare. A questo punto bisogna recarsi sul sito duckdns.org, effettuare il login con uno dei metodi indicati (ad esempio Google) ed aggiungere il dominio di nostra scelta, il quale risulterà con questo formato nomeprescelto.duckdns.org.

Scegliamo un nome su Duck DNS e memorizziamo il token

Prima di chiudere la pagina è molto importante memorizzare il proprio token, che è ben visibile nell'area in alto. Tornando sulla pagina di configurazione dell'add-on su Home Assistant possiamo modificare il codice JSON con la configurazione inserendo sia il token che il dominio registrato. Salviamo senza modificare nient'altro, assicurandoci che "lets_encrypt" rimanga ancora su false. Dopo il salvataggio possiamo cliccare su START per avviare il servizio.

#Esempio di Config per Duck DNS
{
  "lets_encrypt": {
    "accept_terms": false,
    "certfile": "fullchain.pem",
    "keyfile": "privkey.pem"
  },
  "token": "jpfajsdiofds-fdsagfdg-fgag-fdsg-fds",
  "domains": [
    "nomeprescelto.duckdns.org"
  ],
  "seconds": 300
}

troubleshooting: potrebbe apparirvi un ERROR: lock file '/data/workdir/lock', in tal caso un riavvio della macchina (non solo di Home Assistant) risolve la situazione.

Configurare l'inoltro delle porte sul router

Questo passaggio, definito anche port mapping o virtual server, è necessario affinché accedendo dall'esterno al nostro indirizzo IP (o al nome di dominio convertito da Duck DNS) il modem sappia a chi indirizzare la richiesta. Il destinatario è chiaramente Home Assistant che, ricordiamolo, deve avere un IP statico all'interno della rete locale. Per evitare disservizi in fase di configurazione io ho preferito creare temporaneamente due regole (poi ne basterà una sola):

  1. le richieste in arrivo sulla porta 8123 (default di HA) reindirizzate sulla stessa porta ma all'IP di HA
  2. le richieste in arrivo sulla porta 443 (default di https) reindirizzate sempre sulla porta 8123 di HA

Un esempio di port mapping con una seconda regola (quella su 443) che può essere rimossa o disabilitata dopo aver ottenuto il certificato

protip: in seguito potrete optare per porte non standard al fine di incrementare leggermente la sicurezza ma inizialmente dovete per forza utilizzare la porta standard di https (443) per poter ricevere il certificato e sarà necessario passare sempre da questa quando il certificato scadrà ed andrà rinnovato.

duck-dns-richiesta-certificato

Quando il port mapping sarà attivo, potremo richiedere il certificato accettando i termini nella configurazione di Duck DNS

Generazione del certificato

A questo punto possiamo ritornare sulle impostazioni di Duck DNS, che si troverà tra gli add-on già installati del pannello Hass.io. Nel campo Config portiamo a true la variabile "accept_terms" relativa a "lets_encrypt", salviamo e riavviamo il servizio con RESTART. Nei Log del campo inferiore dovremmo vedere apparire la richiesta e la risposta, che richiederà circa 30 secondi per essere espletata. Per accertarvi che il tutto sia andato a buon fine potete accedere in SSH ad Home Assistant (se non lo avete già fatto attivate l'add-on relativo) e controllare che appaiano i due file .pem nella cartella /ssl. È essenziale che questi siano presenti prima di poter proseguire, altrimenti si genereranno degli errori.

troubleshooting: nel mio caso questo passaggio ha richiesto due esecuzioni ed un riavvio prima di funzionare, quindi non demordete e riprovate nel caso si generassero errori.

Aggiornamento configurazione Home Assistant

Ora che abbiamo il certificato SSL dobbiamo indicarlo nella configurazione di Home Assistant. Accedete con il metodo che preferite al file configuration.yaml (solitamente via SMB se avete abilitato l'add-on SMB Share) e modificatelo con Atom.io o qualsiasi altro editor preferiate. Alla voce che inizia con http: troverete già una serie di parametri commentati (la cui riga inizia con #) e dovrete modificarli affinché rimangano attivi questi 4 così configurati:

http:
  api_password: xxxxxxxx
  base_url: nomeprescelto.duckdns.org
  ssl_certificate: /ssl/fullchain.pem
  ssl_key: /ssl/privkey.pem

protip: per non avere password ed altri elementi sensibili in chiaro sparsi in vari file di configurazione, consigliamo di metterli tutti all'interno di secrets.yaml. Si potranno poi richiamare nel punto in cui servono utilizzando la sintassi !secret nome_variabile

home-assistant-https
Accertatevi di aver scritto tutto correttamente e poi effettuare un riavvio di HA da Impostazioni / Generale.

Ultime rifiniture

Se tutto è andato nel verso giusto adesso potrete accedere in remoto al vostro server attraverso l'indirizzo https://nomeprescelto.duckdns.org che verrà ritenuto sicuro grazie al certificato generato da Let's Encrypt. Per evitare che l'indirizzo web esponga pubblicamente la maschera di accesso di HA (a cui vi ricordo di mettere una password robusta nel campo api_password), possiamo cancellare o disabilitare (se il router lo permette) il reindirizzamento della porta standard 443 in modo tale che risulti necessario digitare https://nomeprescelto.duckdns.org:8123 per accedere. Potenzialmente potete modificare il port mapping scegliendo una porta a caso ma non è nascondendo le chiavi sotto lo zerbino che si rende un accesso davvero più sicuro. A tal proposito potete approfondire altri strumenti di protezione attraverso la pagina Securing della documentazione ufficiale.

Autore:
Maurizio Natali (@simplemal)

Revisori:
Davide Dari (@daxda)
Alberto Zamboni (@albyzambo)
Andrea Calabrò (@mastropino)
Cesare Munari (@cmunari)
Andrea Ciardiello (@ilpierr)
Massimiliano Latella (@lamax)

SmartHome Channel

Special Team - I SaggiUtenti del canale #SmartHome presente sul nostro Slack uniti per creare guide e recensioni dedicate all'automazione. Partecipa anche tu entrando nel gruppo effettuando una donazione dal SaggioSupporto.