Skip to main content
Hosting

Come far funzionare il protocollo HTTPS in locale

Quasi tutti i siti web che visiti oggi sono protetti da HTTPS. Se il tuo non lo è ancora, dovrebbe esserlo. Proteggere il tuo server con HTTPS significa anche che non puoi inviare richieste a questo server da uno che non è protetto da HTTPS. Ciò rappresenta un problema per gli sviluppatori che utilizzano un ambiente di sviluppo locale perché tutti vengono eseguiti http://localhost/ immediatamente.

All’avvio di cui faccio parte, abbiamo deciso di proteggere i nostri endpoint AWS Elastic Load Balancer con HTTPS come parte di una mossa per migliorare la sicurezza. Mi sono imbattuto in una situazione in cui le richieste del mio ambiente di sviluppo locale al server hanno iniziato a essere rifiutate.

Dopo una rapida ricerca su Google, ho trovato diversi articoli come questo , questo o questo con istruzioni dettagliate su come implementare HTTPS su localhost.  Nessuna di queste istruzioni sembrava funzionare anche dopo averle seguite religiosamente. Chrome mi ha sempre lanciato un NET::ERR_CERT_COMMON_NAME_INVALID errore.

Il problema

Tutte le istruzioni dettagliate che avevo trovato erano corrette per il tempo in cui erano state scritte. Non più.

Dopo un sacco di ricerche su Google, ho scoperto che il motivo per cui il mio certificato locale veniva rifiutato era che Chrome aveva deprecato il supporto per la corrispondenza commonName nei certificati , in effetti, richiedendo un subjectAltName da gennaio 2017.

La soluzione

Useremo OpenSSL per generare tutti i nostri certificati.

Passaggio 1: certificato SSL di root

Il primo passaggio consiste nel creare un certificato SSL (Root Secure Sockets Layer). Questo certificato radice può quindi essere utilizzato per firmare un numero qualsiasi di certificati che potresti generare per i singoli domini. Se non hai familiarità con l’ecosistema SSL, questo articolo di DNSimple fa un buon lavoro nell’introdurre i certificati SSL radice.

Genera una chiave RSA-2048 e salvala in un file rootCA.key. Questo file verrà utilizzato come chiave per generare il certificato SSL radice. Ti verrà richiesta una passphrase che dovrai inserire ogni volta che utilizzi questa particolare chiave per generare un certificato.

openssl genrsa -des3 -out rootCA.key 2048

È possibile utilizzare la chiave generata per creare un nuovo certificato SSL radice. Salvalo in un file denominato rootCA.pem. Questo certificato avrà una validità di 1.024 giorni. Sentiti libero di cambiarlo in qualsiasi numero di giorni desideri. Ti verranno inoltre richieste altre informazioni facoltative.

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem


Passaggio 2: considera attendibile il certificato SSL radice

Prima di poter utilizzare il certificato SSL radice appena creato per iniziare a emettere certificati di dominio, c’è un altro passaggio. Devi dire al tuo Mac di considerare attendibile il tuo certificato di origine in modo che anche tutti i singoli certificati da esso emessi siano affidabili.

Apri Accesso portachiavi sul tuo Mac e vai alla categoria Certificati nel tuo portachiavi di sistema. Una volta lì, importa rootCA.pem usando File> Importa elementi. Fare doppio clic sul certificato importato e modificare il menu a discesa “Quando si utilizza questo certificato:” in Tr ust sempre nella sezione Attendibilità.

Il tuo certificato dovrebbe assomigliare a questo all’interno di Accesso Portachiavi se hai seguito correttamente le istruzioni fino ad ora.

Passaggio 2: certificato SSL di dominio

Il certificato SSL radice può ora essere utilizzato per emettere un certificato specifico per l’ambiente di sviluppo locale che si trova in localhost.

Crea un nuovo file di configurazione OpenSSL in server.csr.cnf modo da poter importare queste impostazioni durante la creazione di un certificato invece di immetterle sulla riga di comando.

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=US
ST=RandomState
L=RandomCity
O=RandomOrganization
OU=RandomOrganizationUnit
emailAddress=hello@example.com
CN = localhost

Crea un v3.ext file per creare un certificato X509 v3 . Nota come stiamo specificando subjectAltName qui.

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost

Creare una chiave di certificato per localhostutilizzare le impostazioni di configurazione archiviate in server.csr.cnf. Questa chiave è archiviata in server.key.

openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat server.csr.cnf )

Una richiesta di firma del certificato viene emessa tramite il certificato SSL radice che abbiamo creato in precedenza per creare un certificato di dominio per localhost  L’output è un file di certificato chiamato server.crt.

openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext

Usa il tuo nuovo certificato SSL

Ora sei pronto per proteggere il tuo localhost con HTTPS. Spostare i file server.keye server.crt in una posizione accessibile sul server e includerli all’avvio del server.

In un’app Express scritta in Node.js, ecco come lo faresti. Assicurati di farlo solo per il tuo ambiente locale. Non utilizzarlo in produzione .

 

Leave a Reply