Unnikked - Esperienze personali in campo informatico

Come installare ngrok con un certificato self-signed

Abbiamo visto come tramite ngrok sia possibile aprire tunnel locali per esporre un servizio web su Internet.

ngrok di base è un servizio hosted, è possibile usufruire in modo gratuito dell’infrastruttura messa a disposizione dell’autore.

Poiché è disponibile il sorgente del progetto vedremo come compilarli per poter includere un certificato self-signed nel pacchetto.

La ricompilazione del pacchetto non è necessaria nel caso in cui si abbia a disposizione di un certificato wildcard rilasciato da una Certification Authority.

Compilare ngrok

I passaggi illustrati sono stati eseguiti su una installazione pulita di Ubuntu 14.04 LTS su una box Vagrant (nulla toglie di eseguire i passaggi sul vostro computer o server).

ngrok è stato sviluppato utilizzando il linguaggio di programmazione Go, installiamo i componenti base di supporto per la compilazione del sorgente.

sudo apt-get install build-essential golang git mercurial

Cloniamo la repository del progetto per prepararci alla compilazione.

git clone https://github.com/inconshreveable/ngrok.git ngrok
cd ngrok

Prima di passare alla compilazione generiamo il certificato self-signed da includere nei binari che andremo a produrre.

Per facilitare l’inserimento dei comandi definiremo una variabile nella sessione corrente di bash.

NGROK_DOMAIN="miodominio.com"

Dove miodominio.com è il nome dominio che legheremo al server, vedremo in seguito questo aspetto.

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

Una volta generato il certificato copiamolo della cartella assets/client/tls/.

cp rootCA.pem assets/client/tls/ngrokroot.crt

E iniziamo la compilazione del server e del client tramite il comando

make release-server release-client

ngrok-compiled

Avviare il server

Per avviare il server è sufficiente eseguire:

./bin/ngrokd -tlsKey=device.key -tlsCrt=device.crt -domain="$NGROK_DOMAIN" -httpAddr=":8000" -httpsAddr=":8001"

Bisogna prestare attenzione che device.key e device.crt sono i file generati durante la creazione del certificato.

Ovviamente tramite le direttive -httpAddr e -httpsAddr è possibile scegliere le porte da associare ad un collegamento http e https rispettivamente.

Avviare il client

Per avviare il client è necessario informare il programma di voler connettersi ad un servizio che utilizza un certificato non firmato da una certification authority.

echo -e "server_addr: $NGROK_DOMAIN:4443\ntrust_host_root_certs: false" > ngrok-config
./bin/ngrok -config=ngrok-config 80

L’utilizzo di ngrok da ora è come descritto nel precedente articolo.

Configurazione del dominio

Per poter legare un dominio al server è necessario che il server DNS supporti il wildcard per le definizioni delle zone.

Personalmente ho utilizzato Cloudflare poiché lo supporta insieme ad un dominio registrato tramite freenom.

Una volta integrato il dominio a Cloudflare bisogna far puntare un record A all’indirizzo IP del server principale e creare un record CNAME wildcard.

ngrok-cloudflare-cname

In base al nome dominio base scelto (dominio secondo livello, terzo livello ecc) è possibile creare record CNAME in modo tale da legare le stringhe alfanumeriche generate da ngrok ad un livello di dominio interessato.

Ngrok Dominio Base HostName Ngrok Tunnel Url
miodominio.com * [stringa-generata].miodominio.com
tunnel.miodominio.com *.tunnel [stringa-generata].tunnel.miodominio.com
ngrok.miodominio.com *.ngrok [stringa-generata].ngrok.miodominio.com
tunnel.ngrok.miodominio.com *.tunnel.ngrok [stringa-generata].tunnel.ngrok.miodominio.com

Il valore della colonna HostName è ciò che andrebbe inserito nel campo CNAME, la sintassi potrebbe variare in base al servizio usato.

Nota bene, il certificato wildcard deve corrispondere allo schema usato.

Avvio di un server tramite certificato rilasciato da una CA

Se si ha a disposizione un certificato wildcard rilasciato da una certification authority non è necessario ricompilare i sorgenti.

Avvio del server

./ngrokd -tlsKey="/path/to/tls.key" -tlsCrt="/path/to/tls.crt" -domain="example.com"

Dove -tlsKey e -tlsCrt sono i file del certificato rilasciato dal certification authority e -domain è il nome dominio.

Avvio del client

Anche in questo caso bisogna usare un file di configurazione per istruire al client verso quale server connettersi.

server_addr: example.com:4443
trust_host_root_certs: true