In genere molti sviluppatori lavorano con il proprio computer e usano magari MAMP per far girare i propri siti web in locale, nel qual caso può sorgere il bisogno di testare i propri lavori anche con un certificato SSL e in https in localhost, vediamo come si può installare un certificato SSL utilizzando il proprio Mac Osx (in questo caso High Sierra 10.13.6), MAMP con Apache e Chrome.
Come installare un certificato SSL e usarlo con MAMP
Vediamo i passi da fare per poter installare un certificato SSL per lavorare con il proprio MAC in locale.
Installare MAMP
Se non lo avete installato, ovviamente il primo passo è installare MAMP. MAMP è una soluzione veloce per macOS e Windows per crearsi un ambiente di sviluppo locale. Combina i software che in genere troviamo nel server hosting per far girare il nostro sito web: Apache oppure NGINX e MySQL, PHP ed è una applicazione molto usata dagli sviluppatori in genere. Non mi dilungo su come installarlo, in rete si possono trovare migliaia di tutorial per questo.
Generazione di un certificato autofirmato per uso locale
Da Chrome 58, i certificati da utilizzare su localhost devono avere un nome alternativo soggetto SAN. Ottenere un certificato con le giuste proprietà può essere un compito scoraggiante, ma fortunatamente in rete si possono trovare delle soluzioni. La guida scritta da Alexander Zeitler può essere di aiuto per questo, bisogna usare un po’ il terminale e la riga di comando, ma non dovrebbe essere troppo complicato seguendo le sue istruzioni.
Riassumiamo in pratica come si crea un certificato con SAN per localhost:
Generazione del certificato
Apriamo un terminale e digitiamo i comandi di seguito:
mkdir ~ / ssl /
che serve per creare una directory chiamata ssl nella cartella principale, fatto questo dobbiamo posizionarci nella directory creata digitando:
cd ~ / ssl
a questo punto creiamo un file chiamato server.csr.cnf . Ognuno userà il suo editor di testo preferito, io in questo caso sto usando vi e con un comando solo creo e apro il file:
vi server.csr.cnf
Appena vi compare il file vuoto e aperto digitate il comando i che attiva la modalità di inserimento dati dell’editor vi e quindi fate un copia e incolla o scrivete le seguenti informazioni (se avete interesse a capire di più sugli attributi di ogni campo dopo [dn] potete consultare questa guida di Oracle). Chiaramente potete modificare gli attributi a piacere per inserire quelli della vostra organizzazione:
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[dn]
C=US
ST=New York
L=Rochester
O=End Point
OU=Testing Domain
emailAddress=your-administrative-address@your-awesome-existing-domain.com
CN = localhost
Appena sicuri di aver copiato tutto e/o di avere scritto bene, per salvare il file, digitare prima il tasto ESC, e poi
:wq
Seguito da invio. In questo modo si salva il tutto e si esce dalla modifica del file.
Ora abbiamo bisogno di creare un altro un file chiamato v3.ext
vi v3.ext
sempre all’apertura del file digitiamo il comando i per iniziare l’inserimento e copiamo il seguente contenuto:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
Come prima di nuovo digitiamo ESC per uscire dalla modalità inserimento e per salvare uscire di nuovo digitiamo:
:wq
Ora verifichiamo che i file siano nella directory digitando:
ls -la
Che mostrerà tutti i file nella directory ~/ssl/
. E magari controlliamone il contenuto a video con il comando:
cat (nomedelfile)
per verificare di aver scritto bene tutto.
A questo punto siamo pronti per generare una chiave privata RSA, quindi digitiamo a terminale il seguente comando:
openssl genrsa -des3 -out ~ / ssl / rootCA.key 2048
Fatto questo Successivamente genereremo il certificato radice (root) che sarà valido per 1024 giorni:
openssl req -x509 -new -nodes -key ~ / ssl / rootCA.key -sha256 -days 1024 -out ~ / ssl / rootCA.pem
Successivamente andiamo a creare la chiave privata per il certificato (server.key):
openssl req -new -sha256 -nodes -out server.csr -newkey rsa: 2048 -keyout server.key -config <(cat server.csr.cnf)
Ed infine generiamo il certificato (server.crt):
openssl x509 -req -in server.csr -CA ~ / ssl / rootCA.pem -CAkey ~ / ssl / rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext
Se tutto è andato per il verso giusto abbiamo generato il nostro certificato SSL e verifichiamo che il certificato abbia la SAN digitando quanto segue nel terminale:
openssl x509 -text -in server.crt -noout
Diamo un’occhiata e controlliamo che ci sia contenuto questo testo:
X509v3 Subject Alternative Name:
DNS:localhost
Aggiungere rootCA.pem e server.crt all’elenco dei CA root attendibili
Prima che il certificato venga accettato dal browser, è necessario aggiungere sia rootCA.pem sia server.crt all’elenco dei CA root attendibili per il nostro Mac. La cosa si può fare aprendo Accesso portachiavi, per aprire Accesso Portachiavi bisogna aprire il Finder -> Applicazioni -> Utility -> Accesso Portachiavi , poi cliccare su “Sistema” e selezionare la categoria “Certificati”.
Per aggiungere i due files rootCA.pem e server.crt, apriamo un’altra cartella del Finder, cerchiamo la cartella ~/ssl
che abbiamo precedentemente creato quindi trasciniamo i due files, uno per volta, all’interno dell’Accesso Portachiavi che nel frattempo abbiamo lasciato aperto. Quindi li vedremo entrambi comparire nel portachiavi.
Ma non basta. Perché il certificato funzioni, dobbiamo assicurarci che il certificato sia attendibile. Per fare ciò, facciamo doppio clic nel certificato ‘localhost’ e poi nella nuova finestra che si sarà aperta, espandiamo ‘Attendibilità’ e nel campo ‘Quando si usa questo certificato’ selezioniamo ‘Fidati sempre’, all’uscita dal menu e il certificato dovrebbe apparire con una iconcina + su sfondo verde. Fatto!
Siamo pronti per configurare Apache!
Configurazione di Apache per SSL
I file di configurazione di Apache che dobbiamo configurare per l’uso del certificato sono:
httpd.conf
che si trova nella directory /Applications/MAMP/apache/conf/httpd.conf
e httpd-ssl.conf
situato in /Applications/MAMP/apache/conf/extra/httpd-ssl.conf
.
Forse è inutile dirlo, ma meglio fare un backup della tua configurazione attuale ovvero dei due files prima di continuare!
Configurazione di httpd.conf
Per prima cosa aprire il file httpd.conf e se sono commentate, rimuovere il commento dalle seguenti righe o accertarsi che non lo siano:
LoadModule ssl_module modules / mod_ssl.so
Include /Applications/MAMP/conf/apache/extra/httpd-ssl.conf
È possibile che queste righe non siano presenti nel qual caso aggiungetele al file.
Quindi impostare Servername su localhost 443 (assicurarsi che nel file sia definito un solo Servername)
Servername localhost:443
Per il file httpd.conf queste sono tutte le modifiche che servono
Configurazione di httpd-ssl.conf
Quindi, nel file httpd-ssl.conf, procedete come segue:
Impostate il comando Listen
Listen 443
Poi trovate nel file la configurazione di virtualhost che assomiglia a questa:
# General setup for the virtual host
DocumentRoot “/Applications/MAMP/Library/htdocs”
ServerName localhost:443
ServerAdmin you@example.com
ErrorLog “/Applications/MAMP/Library/logs/error_log”
TransferLog “/Applications/MAMP/Library/logs/access_log”
# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine off
Solo un paio di cose devono essere cambiate in questa configurazione. Innanzitutto, VirtualHost dovrebbe essere impostato su *:443, anziché su _default_:443. E assicuratevi che DocumentRoot sia corretto per la vostra configurazione. ServerName deve essere modificato in localhost:443. Infine, SSLEngine deve essere acceso. Il risultato dovrebbe apparire in questo modo:
# General setup for the virtual host
DocumentRoot “/Applications/MAMP/htdocs”
ServerName localhost
ServerAdmin you@example.com
ErrorLog “/Applications/MAMP/Library/logs/error_log”
TransferLog “/Applications/MAMP/Library/logs/access_log”
# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on
Ora per il corretto funzionamento è necessario copiare i files SSL creati precedentemente dalla directory ~/ssl
alla directory /Applications/MAMP/conf/apache
e non ci sarà bisogno di altre modifiche nel file httpd-ssl.conf
E’ possibile copiare il file server.crt e server.key in un’altra directory, ma è necessario assicurarsi di definire il percorso giusto in httpd-ssl.conf.
Visitate in chrome https://localhost
per vedere se la cosa funziona:
OK! Questo è tutto! Ora dovreste avere un ambiente di sviluppo locale con SSL!
Risoluzione dei problemi
Se vi sorgono dei problemi o trovate degli errori o la cosa non vi funziona, ci sono alcuni accorgimenti utili per scovare gli errori. Una è quella di cercare possibili duplicati di configurazione che creano conflitti eseguendo il seguente comando nel Terminale:
grep -r listen /Applications/mamp/conf
Questo mostrerà tutte le istanze in ‘ascolto’ nella directory di configurazione di MAMP.
Altro problema: una volta risolto l’errore, il certificato SSL funziona, ma tutte le richieste https://localhost hanno provocato un errore 404. Questo errore in genere si puà verificare perché “DocumentRoot” è stato definito due volte, sia in httpd.conf che in httpd-ssl.conf. La rimozione di “DocumentRoot” da httpd-ssl.conf dovrebbe risolvere questo problema.
La cosa a volte più noiosa, è successo anche a me, è che lanciando MAMP dal suo pannello grafico Apache non parte, e addirittura non scrive l’errore nei logs, questo è un bug di MAMP, che spero risolvano, ovvero Apache, purtroppo, non scrive tutti gli errori nel file apache_error.log nella directory /Applications/MAMP/logs/.
Se ciò accade, e come ho detto è già successo e può accadere, si può provare a riavviare Apache tramite il Terminale usando questo comando:
sudo /Applications/MAMP/Library/bin/apachectl restart
oppure
sudo /Applications/MAMP/Library/bin/apachectl start
In questo modo Apache mostrerà errori a terminale che non sono arrivati al file di registro, dandovi delle indicazioni utili per la risoluzione di eventuali problemi.