Certificato HTTPS da Synology a Raspberry

Certificato HTTPS

Ho da poco installato in rete un Raspberry Pi 3 Model B+ che uso come webserver per alcuni progetti in Python, PHP e SQL: funziona tutto regolarmente, ma per motivi di sicurezza vorrei accedere dall’esterno col protocollo HTTPS al posto del meno sicuro HTTP.
Per fare questo c’è bisogno di un certificato SSL HTTPS che certifichi che il mio dominio è sicuro.

Non sapete come configurare un web server LAMP sul Raspberry? Nessun problema, date un’occhiata questo articolo precedente.

Prima di tutto, per accedere dall’esterno al Raspberry, occorre eseguire questi passaggi:

  1. inoltro della porta 80 (o alternativa) dal router all’ip locale del Raspberry
    • consiglio di inoltrare una porta alternativa, come la 8080 esterna sulla 80 interna del Raspberry
  2. utilizzo di un dominio dinamico (DDNS)

Visto che nella stessa rete ho un server Synology, ho pensato di utilizzare il suo servizio DDNS integrato che già uso per altri scopi.
Utilizzando il wizard, come mostrato in figura, è possibile creare un dominio xxxx.synology.me  che punterà direttamente al nostro IP remoto , indicato con la freccia:

Synology DDNS service

Ora, se tutto è stato configurato a dovere, digitando dall’esterno http://xxxx.synology.me:8080 devo raggiungere il web server installato sul Raspberry, nel mio caso Apache2. Però non funzionerà ancora il protocollo HTTPS!

Il Synology torna utile anche in questo caso, perché ha già integrato uno strumento per la generazione di certificati SSL firmati da Let’s Encrypt.
Questo ottimo video di Synology dettaglia quali sono i passi da eseguire per la creazione di un certificato valido 90gg con auto rinnovo.

Ora, se punto a https://xxxx.synology.me raggiungo regolarmente il Synology, ma non il Raspberry perché sul mio router la porta 443 HTTPS è inoltrata sull’IP locale del Synology. Devo quindi eseguire un NAT sul router di una porta alternativa alla 443 (suggerisco la 8443 esterna sulla 443 interna) all’IP locale del Raspberry.
Ad operazione ultimata, provo a puntare dal browser su https://xxxx.synology.me:8443 : raggiungo il Raspberry ma qualcosa non funziona ancora, perché il webserver Apache2 non ha il certificato corretto.

Quindi l’idea: usare il certificato firmato da Let’s Encrypt valido 90gg ed importarlo sul Raspberry!

I certificati creati dal wizard sono localizzati nel Synology dentro la cartella di sistema /usr/syno/etc/certificate/_archive/xyz dove “xyz” è un account creato automaticamente dal NAS che collega Synology a Let’s Encrypt. La cartella “xyz” quindi sarà differente per ogni account Synology.me o similare.

All’interno troviamo 3 file che ci interessano:

  • cert.pem è il certificato vero e proprio
  • privkey.pem è la chiave privata
  • chain.pem è la catena di certificazione

Eseguiamo quindi una copia di questi 3 file sul nostro Raspberry.
Usando il terminale, accedo in SSH al Synology con l’utente locale ed eseguo una copia su Raspberry col comando scp , assicurandomi di elevare i permessi a root ( sudo -i ) altrimenti non accedo alla cartella di sistema.

ssh user_synology@ip_synology
sudo -i
scp /usr/syno/etc/certificate/_archive/xyz/*.pem user_raspberry@ip_raspberry:synology_certs
exit
exit

Nota: synology_certs è una cartella precedentemente creata nella home folder di Raspberry.

Ora il certificato e la chiave privata sono presenti nella home folder del Raspberry, nella cartella synology_certs. Decido quindi di copiarli in una cartelle di sistema, precisamente in /etc/apache2/ssl.
Per fare questo:

ssh user_raspberry@ip_raspberry
sudo cp ~/synology_certs/*.pem /etc/apache2/ssl/

Editiamo a questo punto il file /etc/apache2/sites-enabled/default-ssl.conf di Apache per permettergli di leggere certificato, chiave privata e catena:

sudo nano /etc/apache2/sites-enabled/default-ssl.conf

Modifichiamo le righe SSLCertificateFileSSLCertificateKeyFile SSLCertificateChainFile con il percorso corretto:

SSLCertificateFile      /etc/apache2/ssl/cert.pem 
SSLCertificateKeyFile   /etc/apache2/ssl/privkey.pem
SSLCertificateChainFile /etc/apache2/ssl/chain.pem

Usciamo dall’editor di testo (CTRL+X), salviamo il file e riavviamo Apache2 col comando:

sudo systemctl restart apache2
exit

È fatta! Riproviamo ad accedere a https://xxxx.synology.me:8443 notando che il webserver si aprirà correttamente senza errori.

Certificato HTTPS
Il browser ha riconosciuto valido il nostro certificato HTTPS

Ora però, ricordatevi che il certificato scade tra 90gg!
Ho pensato quindi di automatizzare la copia dei nuovi certificati e chiavi private con 2 script in Bash (uno su Synology e uno su Raspberry) che presto pubblicherò qui e su Github.

Buon lavoro!

Commenti

Ancora nessun commento. Perché non inizi una discussione?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.