Scenario: vogliamo rendere uno scambio dati sicure, magari per rafforzare il sistema di autenticazione di un sito web o lo scambio dati fra una webApp, ma anche una App nativa e un server.

Per fare questo dovremo utilizzare il protocollo HTTPS che abbina il comune HTTP ad un ulteriore protocollo di crittografia asimmetrica.
HTTPS è infatti l’acronimo di HyperText Transfer Protocol over Secure Socket Layer.
Questo sistema di sicurezza è stato pensato proprio per evitare che attraverso tecniche di man in the middle un malintenzionato possa fare sniffing dei dati scambiati bidirezionalmente fra server e client.

Problema: se “tirar su” un server LAMP è ormai alla portata di tutti i web developer grazie alle molte distribuzioni out of the box, abilitare l’https è già un’operazione più specificatamente sistemistica, ma ugualmente attuabile in pochi minuti.

Spiegazione: su Ubuntu Server, così come in molte altre distribuzioni, il modulo SSL è già presente nell’installazione base di Apache.
Bisogna solo attivarlo con il seguente comando che abilita anche la porta 443 di default per l’https.

sudo a2enmod ssl

Dovremo quindi predisporre una cartella in cui generare i nostri certificati di sicurezza. Consiglio di creare una sottocartella dentro a quella di apache.

Nel caso di Ubunti dovremo lanciare il comando

sudo mkdir /etc/apache2/ssl

In altre distribuzioni come centOS la sottocartella può essere creata con i comando

sudo mkdir /etc/httpd/ssl

Per ottenere chiave privata e certificato utilizzeremo openssl attraverso il seguente comando, riportando i percorsi corretti, scegliendo la crittografia RSA a 2048 bit e una validità di 365 giorni.

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt

Nel caso openssl non fosse presente, si può installare mediante il seguente comando su Ubuntu (o analoghi su altre distro)

apt-get install openssl

La procedura di creazione dei certificati pone alcune domande alle quali si può rispondere abbastanza liberamente, es:

Country Name (2 letter code) [AU]:IT
State or Province Name (full name) [Some-State]:Modena
Locality Name (eg, city) []:Modena
Organization Name (eg, company) [Internet Widgits Pty Ltd]:communicationBox
Organizational Unit Name (eg, section) []:Development
Common Name (e.g. server FQDN or YOUR name) []:NomeMioServer
Email Address []:maimaildiriferimento@dominio.it

A questo punto il grosso del lavoro è fatto, non resta che settare i virtual host per indicare di sfruttare la cominicazione sicura sulla porta 443 e chiave e certificato appena creati.

Nella cartella /etc/apache2/sites-available/ è solitamente già presente un file di esempio denominato default-ssl.conf che possiamo modificare o utilizzare come modello per creare il nostro file:

sudo nano /etc/apache2/sites-available/default-ssl.conf
<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/html
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/>
                Options -Indexes +FollowSymLinks +MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        Alias /doc/ "/usr/share/doc/"
        <Directory "/usr/share/doc/">
                Options MultiViews FollowSymLinks
                AllowOverride None
                Order deny,allow
                Deny from all
                Allow from 127.0.0.0/255.0.0.0 ::1/128
        </Directory>

</VirtualHost>

Ora la configurazione è terminata, dobbiamo abilitare come di consueto il virtual host:

sudo a2ensite default-ssl.conf

Infine riavviamo il servizio per rendere effettive le modifiche:

sudo service apache2 restart

Ora, sincerandosi che il firewall della nostra connessione consenta il traffico sulla porta 443, puntiamo sull’ip del server, o sul dominio impostato nel virtualhost, ad esempio https://123.123.123.123.
Comparirà un avviso che ci avverte che il certificato non è attendibile, questo è normale in quanto lo abbiamo autogenerato e non acquistato da un ente certificatore. Basterà procedere “accettando i rischi” per navigare in maniera sicura. Naturalmente, per siti o app pubbliche, è vivamente consigliato l’acquisto di un certificato verificato per non “spaventare” l’utente con questo avviso.