Come creare un sito web su https ( sicuro ) con Apache

Come installare un certificato di sicurezza SSL per creare un sito web sul protocollo HTTPS tramite Apache in un server Linux.

Ho scritto le seguenti istruzioni sono state scritte mentre ho installato il certificato di sicurezza di un sito web su un server Linux tramite Apache.

Installare OpenSSL e Mod_ssl su Apache

Prima di tutto verifico se sul web server sono già presenti le ultime versioni di OPENSSL e mod_ssl.

Entro come utente root sul server e digito il seguente comando.

yum install mod_ssl openssl

Il precedente comando verifica se sono installati ed eventualmente, se non sono presenti, li installa sul server o li aggiorna all'ultima versione.

Se OPENSSL e mod_ssl sono già installati sul server all'ultima versione, il comando restituisce in output le informazioni sulla versione installata e il messaggio "Nothing to do":

yum install mod_ssl openssl
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: it.centos.contactlab.it
* epel: ftp.wrz.de
* extras: it.centos.contactlab.it
* updates: it.centos.contactlab.it
Package 1:mod_ssl-2.4.6-67.el7.centos.6.x86_64 already installed and latest version
Package 1:openssl-1.0.2k-8.el7.x86_64 already installed and latest version
Nothing to do

Come impostare i certificati multipli sullo stesso IP

Fino a qualche anno fa si poteva associare un solo certificato PKI per IP sulla porta 443.

In pratica, non era possibile creare più di un sito web in HTTPS sullo stesso indirizzo IP su Apache.

Per avere più domini HTTPS sullo stesso server era necessario assegnare a ogni nome di dominio un numero IP diverso.

Il che rendeva tutto più difficile e costoso.

Perché non era possibile? Al momento di stabilire una sessione sicura TLS, il server non conosce a quale server virtuale si vuole connettere il client perché la sessione TLS si stabilisce prima del dialogo tra client e HTTP.

Con la diffusione del protocollo HTTPS, i sistemi di gestione dei server hanno cominciato a supportare i certificati di sicurezza multipli sullo stesso IP.

Su Apache/Linux i certificati multipli sono consentiti dall'estensione SNI ( Server Name Indication ) del protocollo TLS.

Cos'è l'estensione SNI?

L'estensione SNI permette al client di passare l'informazione del nome di dominio già nelle prime fasi di handshake del protocollo TLS.

Nota. Trattandosi di un'estensione del protocollo TLS, non tutti i client lo supportano. In particolar modo, le vecchie versioni dei browser non supportano SNI.

A livello server SNI è supportato da OpenSSL a partire dalla versione 0.9.8f su Apache 2.4 o superiore.

Apro il file di configurazione ssl.conf di Apache nella directory /ETC/HTTPD/CONF.D di Linux.

la configurazione del file SSL.CONF su Linux

Poi configuro il controllo SSLStrictSNIVHostCheck per gestire i client che non supportano SNI.

In questo caso lo disabilito.

SSLStrictSNIVHostCheck off

Se SSLStrictSNIVHostCheck è disabilitato ( off ) Apache reindirizza sul virtual host di default i browser che non supportano SNI .

Viceversa, se è attivo ( on ) restituisce ai client non-SNI un messaggio di errore 4xx nel log "[error] No hostname was provided via SNI for a name based virtual host".

Creare i file KEY e CSR del dominio

A questo punto devo creare sul server il file con la chiave privata (KEY) e il file per la richiesta di firma del certificato (CSR) del nome dominio che voglio visualizzare in HTTPS.

Entro nella directory ETC/HTTPD

cd /etc/httpd

Poi creo la cartella SSL se non esiste

mkdir ssl

Quindi entro nella cartella SSL

cd ssl

A questo punto genero una RSA chiave privata per il dominio1

openssl genrsa -out domain1.key 2048

Il sistema elabora la richiesta e crea il file domain1.key con la chiave nella cartella SSL

[root@host191-225-110-95 ssl]# openssl genrsa -out eage.key 2048
Generating RSA private key, 2048 bit long modulus
..........................................................+++
.....................+++
e is XXXXXX (0x10001)

poi creo il relativo CSR ( Certificate Signing Request ) digitando il seguente comando

openssl req -new -key domain1.key -out domain1.csr

Per creare il file CSR devo digitare alcune informazioni sul proprietario del dominio:

  • Country Name [ 2 letter code ]
  • State or Province Name [ full name ]
  • Locality Name (eg, city) [ Default City ]
  • Organization Name (eg, company) [ Default Company Ltd ]
  • Organizational Unit Name (eg, section)
  • Common Name (eg, your name or your server's hostname)
  • Email Address
  • A challenge password
  • An optional company name

la procedura di creazione del file CSR

Alle voci Organizational Unit Name, Password e Optional Company Name ( nome opzione della società ) non inserisco nulla.

Ho così creato anche il file CSR del dominio.

Digito DIR per verificare che ci siano entrambi i file.

dir

Se tutto è andato bene dovrei vedere i file KEY e CSR del dominio in questione

domain.key domain.csr

A cosa servono i file CSR e KEY?

  • Il file CSR contiene il codice da utilizzare durante la procedura di attivazione del certificato SSL commerciale.
  • Il file KEY contiene la chiave privata ( Private Key ) da usare per la decriptazione durante la sessione SSL/TLS stabilita tra il server e il client.

Creare il file CRT

A questo punto, una volta creati i file KEY e CSR posso generare il file CRT.

E' meglio cominciare con certificati auto emessi prima di passare ai certificati commerciali esterni rilasciati da autorità CA.

Nota. Fare le prove con i certificati commerciali è poco consigliabile perché, in caso di errore, a volte non si può tornare indietro e si spreca il certificato per nulla. I certificati auto emessi, invece, sono gratuiti e se ne possono emettere quanti uno vuole. Va da sé che i certificati auto emessi vanno bene soltanto per fare i test perché i browser non li riconoscono come certificati emessi da autorità affidabili. Sono però utili per provare se tutto funziona.

Per creare un certificato CRT auto emesso entro nella stessa cartella dove ho salvato i file CSR e KEY del dominio.

cd /etc/httpd/ssl

Poi digito il seguente comando

openssl x509 -req -days 365 -in domain1.csr -signkey domain1.key -out domain1.crt

Dove al posto di domain1.csr e domain1.key devo indicare i nomi dei file CSR e KEY appena creati per il dominio.

Il comando restituisce in output la conferma di firma del certificato

Signature ok
Subject=...
Getting Private Key

Per sicurezza digito DIR per verificare che sia il nuovo file

dir

Nella directory dovrei vedere tre file ( CRT, CSR e KEY ) con lo stesso nome di dominio.

domain.key domain.csr domani.crt

Ora posso spostarmi sulla configurazione del server SSL.

Modificare il file di configurazione ssl.conf

Per importare il certificato devo modificare il file SSL.CONF

Si trova nella directory /ETC/HTTPD/CONF.D del server

Aggiungo il virtual host del dominio sulla porta 443

<VirtualHost *:443>
DocumentRoot /var/www/html
ServerName eage.it
ServerAlias www.eage.it
SSLEngine on
SSLProtocol all -SSLv2
SSLCertificateFile /etc/httpd/ssl/eage.crt
SSLCertificateKeyFile /etc/httpd/ssl/eage.key
</VirtualHost>

Se tutto va bene, il sito web si apre correttamente sotto il protocollo HTTPS.

Tuttavia, il browser mi avvisa che il certificato è auto firmato e non riconosciuto come autorità di certificazione (CA) attendibile.

il certificato autoemesso dà errore NON SICURO quando si naviga il sito web in HTTPS

Una volta testato il funzionamento, posso acquistare il certificato SSL definitivo e sostituirlo a quello autoemesso.

Acquistare il certificato SSL per il sito

Per comprare un certificato SSL ci sono varie soluzioni online.

In questo caso opto per Namecheap perché mi sembra abbastanza economico.

Acquisto il certificato Positive SSL a circa 8 euro l'anno.

la pagina web della vendita dei certificati SSL su Namecheap

Dopo aver acquistato il certificato, entro nella sezione Product List e SSL Certificates.

Quindi clicco su Attivazione vicino al certificato.

cliccare su ATTIVAZIONE

Poi apro il file CSR che ho creato per il sito poco fa, seleziono e copio il contenuto.

Nella schermata successiva incollo il contenuto del file CSR nel campo Enter CSR.

il processo di creazione del certificato SSL

I campi Primary Domain e Server Type si aggiornano automaticamente dopo aver incollato il codice CSR.

Se effettivamente viene visualizzato il nome di dominio e il tipo di server giusto, posso procedere con l'installazione.

Per continuare clicco su Submit.

Nota. In caso contrario, se i dati visualizzati nei campi Primay Domain e Server Type non sono corretti interrompo la procedura cliccando su Cancel.

Nella schermata successiva scelgo un metodo di validazione del certificato.

E' necessario farlo per dimostrare di essere effettivamente il gestore del nome di dominio del sito web.

Posso scegliere uno tra i seguenti metodi alternativi:

  • Email. Il link di validazione del certificato viene spedito all'indirizzo email principale del sito web.
  • HTTP Based. Carico in upload sul server uno specifico file di validazione in una directory del sito web.
  • DNS. Modifico un record del DNS del dominio con una stringa inviata dall'autorità CA.

i metodo di validazione del certificato

Nella schermata seguente digito le informazioni sul proprietario del sito web e i canali di contatto.

la raccolta delle informazioni sul proprietario del nome di dominio

Nella successiva e ultima schermata clicco sul pulsante Confirm.

cliccare su Confirm

Una volta attivato, Namecheap mi invia per email il certificato SSL del nome di dominio.

E' un file zippato composto da due file

i file del certificato di sicurezza SSL

Ci sono più file? Nessun problema. A volte il file bundle è splittato in tre file. Nel prossimo paragrafo spiego come trasformarlo in un unico file.
esempio di file bundle diviso

Caricare i file dei certificati sul server

Il passo successivo è caricare i file dei certificati sul web server nella directory /ETC/HTTPD/SSL.

Posso farlo tramite FTP oppure tramite la funzione upload del server.

Ora nella cartella SSL ci sono tre file:

  1. il file KEY con la chiave privata ( creato precedentemente )
  2. Il file CRT del certificato di sicurezza appena spedito
  3. Il file bundle

i file dei certificati ssl sul server

Ci sono più file? Manca il file di bundle?

A volte il file del certificato CA-bundle viene inviato in tre singoli file distinti.

  • COMODORSADomainValidationSecureServerCA.crt
  • COMODORSAAddTrustCA.crt
  • AddTrustExternalCARoot.crt

In questo caso, posso unirli in un unico file tramite il comando cat di Linux

cat COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt >> nomesito_bundle.crt

Così facendo ottengo comunque un unico file bundle.

Nota. Una volta uniti, è buona norma fare pulizia e cancellare i file COMODORSADomainValidationSecureServerCA.crt, COMODORSAAddTrustCA.crt e AddTrustExternalCARoot.crt dal server Linux.

A questo punto posso installare il certificato di sicurezza sul server.

Installare il certificato SSL sul server

Per installare il certificato SSL sul server rientro su Apache e modifico il file ssl.conf.

Nota. Il nome del file e la directory sul server cambiano a seconda della versione Apache e della distribuzione Linux. In questo caso, io sto usando CentOs. Altre volte il file è chiamato httpd-ssl.conf o default-ssl.conf. Altre ancora l'SSL è configurato in http.conf

Sulle righe del virtual server 443 del sito sostituisco il certificato CRT auto emesso con quello che mi ha appena consegnato Namecheap.

<VirtualHost *:443>
DocumentRoot /var/www/html
ServerName eage.it
ServerAlias www.eage.it
SSLEngine on
SSLProtocol all -SSLv2
SSLCertificateFile /etc/httpd/ssl/www_eage_it.crt
SSLCertificateKeyFile /etc/httpd/ssl/eage.key
</VirtualHost>

La riga della chiave privata ( SSLCertificateKeyFile) la lascio immutata.

Poi aggiunto un'ulteriore riga SSLCACertificateFile per richiamare il file bundle.

<VirtualHost *:443>
DocumentRoot /var/www/html
ServerName eage.it
ServerAlias www.eage.it
SSLEngine on
SSLProtocol all -SSLv2
SSLCertificateFile /etc/httpd/ssl/www_eage_it.crt
SSLCertificateKeyFile /etc/httpd/ssl/eage.key
SSLCACertificateFile "www_eage_it.ca-bundle"
</VirtualHost>

Per rendere operative le modifiche salvo il file di configurazione e riavvio il web server Apache.

Il test finale

Apro il browser per navigare il sito web nel protocollo HTTPS.

Il sito web è visualizzato sul protocollo HTTPS come Sicuro con il lucchetto verde e senza alcun messaggio di errore.

il certificato SSL è stato installato sul sito

Ho così installato il certificato SSL sul sito web tramite Apache.

E per fare il redirect da Http a Https? Per impostare il redirect automatico da Http a Https si può modificare il file .HTACCESS o impostarlo direttamente nel sorgente PHP del sito web dinamico. In questo modo, si forza la visualizzazione del sito soltanto su un protocollo. E' molto importante soprattutto ai fini SEO per evitare la duplicazione dei contenuti del sito nei due protocolli.

 


 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base

Libri di approfondimento

Https e SSL