Introduzione
Per aggiungere al comune HTTP un protocollo aggiuntivo di crittografia asimmetrica è necessario configurare sul tuo server una connessione SSL, ovvero Secure Sockets Layer.
Il protocollo SSL può essere utile per rafforzare il sistema di autenticazione di un sito web o lo scambio di dati fra un'app e il server. In questa guida vedremo come configurare una connessione SSL e abilitare quindi il protocollo HTTPS su Apache 2 con un server Linux Ubuntu 20.04.
Per prima cosa dovrai connetterti al tuo server tramite una connessione SSH. Se non l’hai ancora fatto, ti consigliamo di seguire la nostra guida per connetterti in sicurezza con il protocollo SSH. In caso di server locale puoi passare al punto successivo e aprire il terminale del tuo server.
Ottienere un Certificato SSL
Per permettere ad Apache di creare una connessione sicura hai bisogno di un certificato SSL che potrai ottenere da un'Autorità di Certificazione (CA). Per praticità in questo esempio utilizzeremo un certificato self-signed ovvero autofirmato, che si adopera solamente in ambienti di test e sviluppo. Per ottenere un certificato self-signed puoi fare riferimento alla nostra guida per Creare un certificato SSL Self-Signed.
Se invece ti interessa ottenere un certificato SSL gratuito rilasciato da una Certification Authority puoi seguire la nostra guida su Come mettere in sicurezza Apache con Let's Encrypt e Ubuntu 18.04.
Nota importante:
Durante la creazione del certificato dovrai specificare l'indirizzo IP del tuo server o il nome del tuo dominio quando ti sarà chiesto il Common Name:
Common Name (e.g. server FQDN or YOUR name) []: dominio.it
Dopo aver ottenuto il certificato crea la cartella /etc/certificato:
$ sudo mkdir /etc/certificato
Quindi salva al suo interno sia il certificato che la chiave privata.
Configurare i parametri SSL di Apache
Procedi impostando le direttive per la connessione protetta che Apache andrà a creare. Per farlo crea il file ssl-params.conf all'interno della directory conf-available di Apache:
$ sudo nano /etc/apache2/conf-available/ssl-params.conf
Incolla la seguente configurazione base all'interno del file appena creato:
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off
Quindi salva e chiudi il file.
Modificare il Virtual Host
Successivamente dovrai modificare la configurazione SSL del Virtual Host relativo al dominio che vorrai proteggere con connessione SSL. In questo tutorial utilizzeremo la configurazione SSL del Virtual Host di default di Apache come esempio.
Apri la configurazione SSL del Virtual Host:
$ sudo nano /etc/apache2/sites-available/default-ssl.conf
Ti troverai davanti a un file strutturato in questa maniera:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
Imposta correttamente la direttiva ServerAdmin inserendo la tua email e aggiungi la direttiva ServerName seguita dal tuo dominio o dall'indirizzo IP del tuo server.
Infine cambia il percorso indicato dalle direttive SSLCertificateFile e SSLCertificateKeyFile, inserendo rispettivamente il percorso del tuo certificato e quello della chiave privata.
Otterrai un risultato simile a questo:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin [email protected]
ServerName miodominio.it
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/certificato/certificato.crt
SSLCertificateKeyFile /etc/certificato/privata.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
Quindi salva e chiudi il file.
Configurare il Firewall
Se sul tuo sistema è presente un firewall allora dovrai impostarlo per abilitare il traffico HTTP e il traffico HTTPS verso la tua macchina.
Nel caso in cui utilizzassi il firewall UFW, avrai a disposizione dei profili preinstallati per Apache. Vediamo quindi come abilitarli.
Per verificare i profili disponibili installati nel firewall UFW esegui questo comando:
Verrà mostrata a schermo una lista simile a questa:
Available applications:
Apache
Apache Full
Apache Secure
OpenSSH
Per consentire il traffico HTTP (Porta 80) e HTTPS (Porta 443), dovrai utilizzare il profilo "Apache Full".
Puoi verificare le informazioni del profilo in questo modo:
$ sudo ufw app info "Apache Full"
Apparirà la descrizione del profilo a schermo:
Profile: Apache Full
Title: Web Server (HTTP,HTTPS)
Description: Apache v2 is the next generation of the omnipresent Apache web
server.
Ports:
80,443/tcp
Dopo aver verificato il profilo, potrai abilitarlo:
$ sudo ufw allow in "Apache Full"
Configurare Apache
A questo punto sei pronto ad apportare le modifiche alla configurazione di Apache.
Abilita i moduli mod_ssl e mod_headers:
$ sudo a2enmod ssl
$ sudo a2enmod headers
Abilita la lettura della configurazione SSL che hai creato in precedenza:
$ sudo a2enconf ssl-params
Abilita il Virtual Host SSL di default:
$ sudo a2ensite default-ssl
Verifica di non aver commesso errori di sintassi nei file di configurazione di Apache:
$ sudo apache2ctl configtest
Se appare a schermo il messaggio "Syntax OK" puoi procedere con il riavvio di Apache:
$ sudo systemctl restart apache2
Verificare la connessione protetta
Apri il tuo browser collegandoti al dominio o all'indirizzo IP del Virtual Host che hai configurato, facendo attenzione a utilizzare il protocollo https://
https://dominio.it
Se la pagina si apre correttamente, senza messaggi di errore, e il browser mostra l'icona del lucchetto, vorrà dire che la connessione è sicura e avrai correttamente abilitato il protocollo HTTPS sul tuo sito web.