Fin dalle prime fasi di sviluppo è bene porre attenzione al rispetto dei protocolli di sicurezza, ogni sviluppatore o amministratore di sistema dovrebbe implementare fin da subito regole e certificati SSL. Ma sfruttare questi ultimi durante lo sviluppo locale di un'applicazione può non essere immediato, non è infatti possibile ricevere certificati SSL/TLS per gli URL locali.
Ecco perché Let's Encrypt ha pubblicato una serie di consigli per sfruttare il protocollo HTTPS fin da subito, anche in locale.
Generazione del certificato
Durante lo sviluppo di una Web App è normale eseguire in locale un web server come Apache o Nginx e accedervi tramite l'URL
http://localhost:8000/
Ovviamente non è possibile richiedere un certificato per localhost, ma si puo lavorare con HTTPS anche in locale? La risposta è semplice, basta generare un proprio certificato self-signed o signed by a local root. Ovviamente questo certificato funzionerà solo per il proprio ambiente di sviluppo, tuttavia per lo sviluppo in locale è perfetto.
È possibile generare un certificato self-signed tramite il pacchetto di OpenSSL:
openssl req -x509 -out localhost.crt -keyout localhost.key \
-newkey rsa:2048 -nodes -sha256 \
-subj '/CN=localhost' -extensions EXT -config <( \
printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
Una volta generato sarà possibile aggiungerlo manualmente alla lista dei trusted roots locali e iniziare a sviluppare indicando alla propria Web App di utilizzare sempre HTTPS senza ricevere avvisi di sicurezza.
Cross-Origin Resource Sharing
Alcuni servizi Web offrono un'applicazione nativa da affiancare al sito Web per accedere a delle feature extra. Applicazioni come Dropbox o Spotify possono per esempio ricercare file presenti nel proprio disco fisso, funzione che non è possibile sfruttare con le Web App.
Solitamente queste applicazioni native implementano le funzionalità del sito Web tramite un Web server su localhost ed inviano le richieste dell'utente al portale Web tramite WebSockets, ma spesso tali connessioni non sono protette.
I browser moderni considerano i link locali come
http://127.0.0.1:8000/
"fidati", quindi non è necessario acquistare un certificato, questo perché tali URL sono considerati al riparo da attacchi di tipo Man in the Middle. Tuttavia localhost non gode dello stesso trattamento, perché non è possibile associare un certificato SSL/TLS a localhost senza esporsi a rischi. Diversi browser implementano poi sistemi di Mixed Content Blocking.
Si dovrebbe quindi implementare sistemi di Access-Control-Allow-Origin o CORS (Cross-Origin Resource Sharing) che consentono di richiedere risorse limitate (come ad esempio dei font) ad una pagina Web di un altro dominio, il tutto sfruttando richieste sotto protocollo HTTP che però possono essere selettivamente bloccate o accettate in modo intelligente dagli algoritmi di CORS.
Questo meccanismo è perfetto per lavorare su localhost anche senza ricorrere ad un certificato e rappresenta un'ottima alternativa per le applicazioni native che vogliono offrire una maggiore sicurezza.
Via Let's Encrypt