Apache & SSL: configurare il protocollo https


Guida pratica alla creazione di un certificato SSL su Apache e alla relativa configurazione di una connessione https

19/01/2018

Perchè avere un certificato SSL

Presentare ai clienti un sito web affidabile è un fattore distintivo importantissimo, che porta vantaggi sia in termini di immagine che di sicurezza, soprattutto nello sviluppo si e-commerce, dove il cliente finale esige la sicurezza delle transazioni che effettua all’interno del sito. Tipicamente un certificato SSL è usato per rendere sicure le connessioni da un browser ad un web server, quando per esempio vi sono transazioni con carta di credito, trasferimento di dati, autenticazione e molti altri casi.

Disporre di un protocollo https è diventato ormai da qualche anno fondamentale anche in ottica SEO. Google infatti dal 2014 lo giudica un fattore molto importante per il ranking, come citato in questo articolo:

“Security is a top priority for Google. We invest a lot in making sure that our services use industry-leading security, like strong HTTPS encryption by default.”

In sostanza Google ritiene i siti che dispongono di https più affidabili e di conseguenza ne favorisce il loro posizionamento a discapito di siti con protocollo http. Tutto questo è finalizzato a rendere il mondo del web più sicuro e garantito.

Cos’è un certificato SSL

Un certificato SSL (Secure Sockets Layer) e il suo successore TLS (Transport Layer Security) sono protocolli standard che proteggono le comunicazioni via web assicurando che le informazioni trasmesse dagli utenti rimangano riservate e sicure e non vengano in alcun modo intercettate da terze parti. Come vedremo in seguito si tratta di una serie di file che collegano digitalmente una chiave crittografica ad un’organizzazione, come ad esempio un azienda. Ne consegue che il certificato è strettamente collegato ai dati societari e ad un singolo nome di dominio.

Una volta installati correttamente i certificati sul server web, il protocollo cambierà da http ad https, rendendo lo scambio di dati sicuro.

In questo articolo vedremo come installare passo passo un certificato SSL su un server web Apache presente su una macchina Linux e generato tramite il toolkit OpenSSL.

Installazione del certificato: guida passo passo

1. Generare una chiave privata

Il protocollo SSL utilizza una coppia di chiavi, una privata e una pubblica, per autenticare le connessioni.

La chiave privata è un file di testo utilizzato inizialmente per generare un CSR (Certificate Signing Request) e in seguito verificare le connessioni utilizzando il certificato SSL creato tramite il CSR. Questo file è molto importante e non deve assolutamente essere divulgato, ma anzi deve risiedere in una cartella protetta, in quanto chiunque ne venga in possesso potrebbe utilizzarlo per scopi illegittimi.

La chiave pubblica per contrasto viene distribuita pubblicamente come parte del certtificato SSL e lavora insieme con la chiave privata per verificare la criptazione e la sicurezza dei dati. Chiunque sia in possesso della chiave pubblica (ad esempio un browser) può verificare l’autenticità del certificato, senza essere a conoscenza della chiave privata.

È consigliabile tenere tutti i file in una sola cartella della macchina, per esempio in questo caso è buona prassi utilizzare la cartella /etc/apache2/certs/nome-dominio

Tramite openssl digitare dunque il seguente comando:

openssl genrsa -des3 -out privatekey.key 2048

A questo punto verrà richiesto di immettere una password. Quest’ultima dev’essere robusta e dovrà essere memorizzata, poichè servirà in un secondo momento. A tal seguito verrà generato il file privatekey.key, che sarà la chiave privata per il certificato SSL.

2. Generare il file CSR

Un certificato CSR (Certificate Signing Request) è un blocco di testo codificato da distribuire ad un’autorità di certificazione quando viene richiesto un certificato SSL. Come per la chiave privata anche questo file viene generato all’interno del server web ed è consigliato tenerlo nella stessa cartella. Al suo interno contiene informazioni che servono per generare il certificato ed inoltre contiene la chiave pubblica che viene generata in automatico. Per generare questo file è necessario fornire la chiave privata generata nello step precedente. Nel dettaglio questo file contiene:

  • Common Name: il nome del dominio sul quale si vuole installare il certificato SSL. Dev’essere esattamente quello che viene visto nell’url del browser, ad esempio www.touchmultimedia.com
  • Organization: nome legale dell’organizzazione. Questo nome non deve essere abbreviato e deve contenere i suffissi come S.r.lIncCorp
  • Organization Unit: la divisione interna dell’organizzazione che gestirà il certificato. Lasciare vuota se è l’organizzazione stessa a richiederlo
  • City/Locality: la città dove risiede l’organizzazione
  • State/Country/Region: il nome completo dello stato o regione dove risiede l’organizzazione (es. Italy)
  • Country: Le due lettere ISO code dello stato dove risiede l’organizzazione (lista completa)
  • Email address: indirizzo email con cui contattare l’organizzazione
  • Public key: la chiave pubblica che verrà inserita nel certificato. Quest’ultima viene generata in automatico

Digitare dunque il comando:

openssl req -new -key privatekey.key -out request.csr

A questo punto verrà chiesta la password collegata alla chiave privata e partirà uno script nel quale verranno chieste tutte le informazioni viste sopra. Una volta immesse tutte le informazioni verrà generato il certificato CSR, che sarà una cosa di questo tipo:

-----BEGIN CERTIFICATE REQUEST-----
MIICvDCCAaQCAQAwdzELMAkGA1UEBhMCVVMxDTALBgNVBAgMBFV0YWgxDzANBgNV
BAcMBkxpbmRvbjEWMBQGA1UECgwNRGlnaUNlcnQgSW5jLjERMA8GA1UECwwIRGln
aUNlcnQxHTAbBgNVBAMMFGV4YW1wbGUuZGlnaWNlcnQuY29tMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8+To7d+2kPWeBv/orU3LVbJwDrSQbeKamCmo
wp5bqDxIwV20zqRb7APUOKYoVEFFOEQs6T6gImnIolhbiH6m4zgZ/CPvWBOkZc+c
1Po2EmvBz+AD5sBdT5kzGQA6NbWyZGldxRthNLOs1efOhdnWFuhI162qmcflgpiI
WDuwq4C9f+YkeJhNn9dF5+owm8cOQmDrV8NNdiTqin8q3qYAHHJRW28glJUCZkTZ
wIaSR6crBQ8TbYNE0dc+Caa3DOIkz1EOsHWzTx+n0zKfqcbgXi4DJx+C1bjptYPR
BPZL8DAeWuA8ebudVT44yEp82G96/Ggcf7F33xMxe0yc+Xa6owIDAQABoAAwDQYJ
KoZIhvcNAQEFBQADggEBAB0kcrFccSmFDmxox0Ne01UIqSsDqHgL+XmHTXJwre6D
hJSZwbvEtOK0G3+dr4Fs11WuUNt5qcLsx5a8uk4G6AKHMzuhLsJ7XZjgmQXGECpY
Q4mC3yT3ZoCGpIXbw+iP3lmEEXgaQL0Tx5LFl/okKbKYwIqNiyKWOMj7ZR/wxWg/
ZDGRs55xuoeLDJ/ZRFf9bI+IaCUd1YrfYcHIl3G87Av+r49YVwqRDT0VDV7uLgqn
29XI1PpVUNCPQGn9p/eX6Qo7vpDaPybRtA2R7XLKjQaF9oXWeCUqy1hvJac9QFO2
97Ob1alpHPoZ7mWiEuJwjBPii6a9M9G30nUo39lBi1w=
-----END CERTIFICATE REQUEST-----

3. Richiedere il certificato SSL

I certificati SSL devono essere rilasciati da un’autorità di certificazione o da rivenditori. Non esiste un unica tipologia di certificato ma i prodotti venduti sono diversi e in base alla variazione del prezzo varia ovviamente la robustezza della sicurezza che essi conferiscono. Come prodotto consigliamo RapidSSL, in quanto rappresenta un buon compromesso tra qualità e prezzo ed è disponibili sulle maggiori piattaforme. Qualsiasi autorità di certificazione, una volta scelto il prodotto, chiederà, oltre ai dati organizzativi, il file CSR generato nello step precedente. L’emissione richiede solitamente dalle 24 alle 48 ore, in quanto vengono effettuati dei controlli che asseriscono la validità dell’organizzazione in questione. Una volta che il certificato viene emesso vengono solitamente forniti due file:

  • Il certificato SSL, contenuto in un file .crt
  • Il certificato intermedio, contenuto in un secondo file .crt

A questo punto è possibile procedere con l’installazione del certificato sul server web.

4. Installare il certificato su Apache2

Anzitutto è necessario abilitare il modulo ssl per apache:

sudo a2enmod ssl

Una volta abilitato il modulo è necessario riavviare il server, in modo che riconosca le modifiche effettuate:

sudo service apache2 restart

Ora è necessario configurare il file di host associato al nome del dominio in questione in modo da utilizzare i certificati rilasciati. La porta utilizzata dal protocollo https è la 443, per cui, in aggiunta alla porta 80 è necessario aggiungere un nuovo virtual host.

<VirtualHost *:80>
  DocumentRoot /var/www/html/my-website
  ServerName www.my-website.com
  <Directory "/var/www/sites/my-website">
    allow from all
    Options +Indexes
    AllowOverride All
  </Directory>
</VirtualHost>

<VirtualHost *:443>
  SSLEngine on
  SSLCertificateFile /etc/apache2/certs/my-website/my-website-ssl.crt
  SSLCertificateKeyFile /etc/apache2/certs/my-website/my-website.key
  SSLCertificateChainFile /etc/apache2/certs/my-website/my-website-ssl-intermediate.crt

  DocumentRoot /var/www/html/my-website
  ServerName www.my-website.com
  
  <Directory "/var/www/html/my-website">
    allow from all
    Options +Indexes
    AllowOverride All
  </Directory>
</VirtualHost>

Come si può notare sono presenti 4 aggiuntive, fondamentali per la configurazione del certificato SSL:

  • SSLEngine on : indica che sul dominio è attivo un certificato SSL
  • SSLCertificateFile : indica il percorso fisico del file .crt primario
  • SSLCertificateKeyFile : indica il percorso fisico della chiave private generata nello step 1
  • SSLCertificateChainFile : indica il percorso fisico del file intermedio .crt

A questo punto è necessario salvare il file e riavviare il server:

sudo service apache2 restart

Se tutto è andato a buon fine il sito web configurato è accedibile tramite protocollo https.

5. Redirect da http a https

Come si potrà notare il sito web non solo è accedibile da https, ma è ancora compatibile con http. È buona prassi redirigere tutte le richieste da http verso https, in modo da utilizzare esclusivamente il protocollo https. Esistono diversi metodi per raggiungere questo risultato, in questo articolo verrà utilizzato di nuovo Apache, con il modulo mod_alias:

sudo a2enmod alias
sudo service apache2 restart

A questo punto è necessario modificare il file di host modificato in precedenza e nella configurazione dell’http aggiungere:

<VirtualHost *:80>
  ServerName www.my-website.com
  Redirect / https://www.my-website.com/
  ...
  ...