Accedere ad Home Assistant in modalità sicura con DuckDNS e SSL Let's Encrypt(aggiornato con sensore e notifica telegram)
di Luigi Duchi
04 Maggio 2018
Home Assistant
Benvenuti amici, oggi parleremo di come firmare tramite SSL il vostro DDNS. Di cosa sto parlando?
Navigando su internet vi sarete imbattuti sicuramente in siti che mostravano l'inizio dell'indirizzo con una sigla https e in altri che invece riportavano semplicemente http. Cosa sono e in cosa si differenziano questi due protocolli?
Nel protocollo http (HyperText Transfer Protocol) tutte le comunicazioni avvengono “in chiaro” senza alcun genere di sicurezza e si basano sul protocollo TCP/IP
Il protocollo https (HyperText Transfer Protocol over SSL) impiega, oltre al protocollo TCP/IP, il livello SSL - Secure Sockets Layer - che si occupa della crittografia e dell'autenticazione dei dati trasmessi.
HTTP si appoggia generalmente sulla porta 80 mentre HTTPS sulla porta 443.
Quindi con questa firma renderemo piu sicuro il nostro DDNS, vediamo come fare:
prenotate l'indirizzo ip del vostro raspberry sul vostro router (di solito questa impostazione la trovate nella sezione server DHCP alla voce ip resenvation) o impostatelo manualmente in modo che sia sempre il solito anche in mancanza di corrente e successivo ripristino.
La prima operazione da fare sarà creare un ddns e consiglio di crearlo con Duckdns, potrete raggiungere il sito qui.
Loggatevi, con la modalità che preferite, e una volta entrati, create un dominio con la parola che più preferite
Una volta creato andate nelle impostazioni del vostro router, nelle impostazioni di inoltro porte (Port Forwarding) andrete ad inoltrare la porta 8123 sia in uscita che in entrata verso l'indirizzo IP del vostro raspberry. Salvate le modifiche e uscite dalle impostazioni del vostro router.
recatevi nel file configuration.yaml sul vostro raspberry e andrete ad aggiungere la seguente stringa:
dove dopo domain: inserirete il dominio che avete creato su duckdns senza altre voci o suffissi nel mio caso raspberrygigi
mentre dopo token: inserirete il token che potrete reperire nella pagina principale di duckdns una volta effettuato il login
salvate e riavviate il raspberry.
Torniamo adesso sulla pagina di duckdns faremo il login e dalla pagina principale cliccheremo su install in alto
e successivamente selezioneremo pi e in basso scegliamo, nel menu a tendina, il dominio che abbiamo creato
nella pagina che vi si aprirà ci sarà la procedura per installare sul nostro raspberry la procedura per ssl, tenetela aperta e proseguite cosi:
sul terminale del nostro raspberry creiamo la directory duckdns digitando il comando:
mkdir duckdns
dopo andiamo all'interno della directory duckdns con il comando:
cd duckdns
e digitiamo il comando:
sudo nano duck.sh
nel file che vi andrà a creare andrete a copiare questa stringa che troverete nella pagina che precedentemente avrete lasciato aperto in duckdns:
ovviamente nella parte censurata dovrete inserire il vostro token che potrete reperire nella pagina principale di duckdns, mentre dove è scritto exampledomain andrà inserito il vostro dominio duckdns. Inoltre alla fine della stringa eventualmente modificate la directory dove avete creato la cartella duckdns (es. nel mio caso /home/pi/duckdns/duck.log invece che ~/duckdns/duck.log)
salvate il documento e uscite (ctrl+x>y>invio)
tornate nel terminale assicuratevi di essere sempre dentro la directory duckdns, in caso contrario ridigitate il comando cd duckdns
digitate il comando:
sudo chmod 700 duck.sh
e subito dopo digitate il comando:
crontab -e
vi chiederà con che editor vorrete aprire il file scegliete il numero corrispondente a nano
nel file che si aprirà dovrete scorrere in fondo e dopo l'ultima riga copiate dalla solita pagina aperta di duckdns la seguente stringa:
*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1
salvate il documento e uscite (ctrl+x>y>invio)
digitate il comando per testare lo script:
sudo ./duck.sh
dopo digitate il comando:
cat duck.log
se tutto e' andato a buon fine vedrete comparire un ok in caso contrario un ko, ricontrollate nel caso token e dominio nello script duck.sh
infine scrivete il comando:
sudo service cron start
bene riavviate il vostro raspberry, al riavvio vedrete che potrete collegarvi al vostro home assistant con il vostro ddns ovvero digitando sul vostro browser per esempio:
http://vostrodominio.duckdns.org:8123
ciò vi consentirà di connettervi al vostro Home Assistant anche quando sarete fuori casa.
Vediamo adesso come aumentare la sicurezza aggiungendo la firma SSL al nostro DDNS appena creato:
per prima cosa andiamo nelle impostazioni del nostro router sempre alla voce inoltro porte andando a chiudere la porta 8123 sull'indirizzo ip del raspberry (quella che avevamo aperto precedentemente)
andiamo invece ad aprire la porta 80 sia sulla porta interna che su quella esterna sempre sul nostro ip del raspberry, la stessa cosa la faremo con la porta 443. Salviamo le impostazioni del nostro router e rechiamoci sul terminale del raspberry.
digitate il comando:
git clone https://github.com/letsencrypt/letsencrypt
poi andiamo nella directory letsencrypt con il comando:
cd letsencrypt
e poi digitiamo la stringa:
sudo ./letsencrypt-auto certonly --email VOSTRAMAIL -d VOSTRODDNS
ad esempio:
sudo ./letsencrypt-auto certonly --email mariorossi@gmail.com -d mariorossi.duckdns.org
aspettate che finisca tutta la procedura e quando vi verrà chiesto di scegliere scegliete il numero che corrisponde a:
Automatically use a temporary webserver (standalone)
Accettate quando vi verrà chiesto di farlo.
quando avra' finito di elaborare andate a scrivere il comando:
sudo chmod -R 777 /etc/letsencrypt
tornate ora nelle impostazioni del router, ancora una volta nelle impostazioni di inoltro porte, cancellate l'inoltro della 80 e della 443 che avete effettuato prima e al suo posto metterete la 443 su porta esterna e la 8123 su porta interna, sempre sull'indirizzo ip del vostro raspberry.
salvate le nuove impostazioni.
recatevi ora sul file configuration.yaml sotto la voce http: andrete a scrivere la seguente stringa.
salvate il file e poi tornate sul terminale e lanciate il comando per riavviare il vostro raspberry:
sudo reboot
al riavvio andate sul browser e se tutto è andato bene, potrete accedere al vostro Home Assistant tramite https ad esempio:
https://vostrodominio.duckdns.org
Non sarà necessario inserire nessuna porta.
E' importante sottolineare che il certificato avrà una durata di 90 giorni al termine dei quali (ma si potrà gia dieci giorni prima della scadenza) si dovrà rinnovare, vediamo come:
Rinnovo certificato ssl:
Innanzitutto voglio assolutamente ringraziare Francesco Bernardi(@Budmc) un utente del nostro blog che mi ha aiutato con un problema del rinnovo dei certificati,oltre a convincermi a non lanciare il Raspberry dalla finestra ;-)
il certificato potrete rinnovarlo quando volete in maniera manuale, tramite questa procedura:
- Andate nelle impostazioni del vostro router e aprite la porta 80 sia interna che esterna sull'indirizzo ip del vostro raspberry
- aprite il terminale sul vostro raspberry
- se avete in esecuzione il servizio apache2 fermatelo con il seguente comando:
sudo service apache2 stop
Questo comando sarà necessario in quanto e avrete questo servizio attivo andrà ad occupare la porta 80 di fatto impedendo il rinnovo del certificato
una volta fermato il servizio (se vi dovesse dare un messaggio di errore probabilmente non avrete apache2 installato ignorate l'errore e andate avanti con la guida.)
- digitate e premete invio il comando:
cd letsencrypt
andrete così nella directory letsencrypt
dopodichè digitate:
sudo ./letsencrypt-auto certonly --email VOSTRAMAIL -d VOSTRODDNS
ad esempio:
sudo ./letsencrypt-auto certonly --email mariorossi@gmail.com -d mariorossi.duckdns.org
e premete invio
- Quando ve lo chiederà
selezionate il numero relativo a
Spin up a temporary webserver (standalone)
e premete invio
- selezionate il numero relativo e premete invio per
Renew & replace the cert (limit ~5 per 7 days)
attendete e una volta ricevuta conferma di avvenuto rinnovo riavviate il vostro raspberry con il comando:
sudo reboot
al riavvio potrete tornare nelle impostazioni del vostro router e chiudere la porta 80.
###########################Aggiornamento##########################
per meglio monitorare i giorni che mancano alla scadenza potrete creare un sensore nel file sensor.yaml:
- platform: command_line
name: Scadenza SSL
unit_of_measurement: days
scan_interval: 10800
command: "ssl-cert-check -b -c /etc/letsencrypt/live/ILVOSTRODDNS.duckdns.org/cert.pem | awk '{ print $NF }'"
se il sensore non dovesse segnare i giorni aprite il terminale del raspberry e scrivete questo comando:
sudo apt-get install ssl-cert-check premete invio e dovreste vedere i giorni mancanti.
Successivamente potrete creare un automazione in automation.yaml per farvi notificare superata una certa soglia impostabile cambiando il numero dopo below:
- alias: ssl in scadenza
hide_entity: True
trigger:
platform: numeric_state
entity_id: sensor.scadenza_ssl
below: 20
action:
service: notify.telegram
data:
Produrre e aggiornare contenuti su vincenzocaputo.com richiede molto tempo e lavoro. Se il contenuto che hai appena letto è di tuo gradimento e vuoi supportarmi, clicca uno dei link qui sotto per fare una donazione.