Capita spesso sia in ambito domestico che in piccole realtà professionali di dover scambiare dati in sicurezza tra le parti remote senza il dubbio che il traffico venga intercettato e letto da qualcuno nel mezzo, i protocolli TLS ( transport layer security) ed il suo predecessore SSL ( secure sockets layer ) sono proprio protocolli di sicurezza creati per crittografare il normale traffico di rete.

Questi protocolli oggi sono anche utilizzati per convalidare l'identità di domini su Internet stabilendo l'affidabilità di un server. In questo articolo, vedremo come creare un certificato SSL per Apache autogenerato ed autofirmato su un server Ubuntu o su un Raspberri PI consentendoci di crittografare il traffico da e verso il nostro server. Sebbene questo non offra il vantaggio della convalida di terze parti dell'identità del server, ci consente di trasferire le informazioni in modo sicuro. 

Il supporto SSL in realtà è già preinstallato su molte distribuzioni Apache per Linux abbiamo semplicemente bisogno di abilitarlo per poter iniziare a sfruttare il protocollo SSL sul nostro sistema.

Abilitiamo quindi il modulo digitando:

sudo a2enmod ssl

Dopo aver abilitato SSL, riavviamo il server web affinché la modifica venga riconosciuta:

sudo service apache2 restart

ora il nostro server web se configurato correttamente sarà in grado di gestire il protocollo SSL

Creamo un certificato SSL autofirmato

Iniziamo creando una sottodirectory all'interno della cartella di configurazione di Apache per posizionare i file del nostro certificato

sudo mkdir /etc/apache2/ssl

Ora che abbiamo dove posizionare la chiave ed il certificato, possiamo generarli entrambi in un solo passaggio 

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

Esaminiamo esattamente cosa significa questa stringa di comando.

  • openssl: è lo strumento fornito da OpenSSL per la creazione e la gestione dei certificati, delle chiavi, delle richieste di firma, ecc.
  • req: è un indicazione con la quale indichiamo che stiamo richiedendo un certificato X.509 (CSR). X.509 standard di infrastruttura a chiave pubblica a cui SSL aderisce per la gestione delle chiavi e dei certificati.
  • -x509: questa opzione specifica che vogliamo creare un file di certificato autofirmato e che non vogliamo generare una richiesta di certificato.
  • -nodes: questa opzione dice a OpenSSL che non vogliamo proteggere il nostro file chiave con una passphrase. Avere un file chiave protetto da password impedirebbe l'avvio automatico di Apache in quanto dovremmo inserire la password ogni volta che il servizio viene riavviato.
  • -giorni 365: specifica che il certificato che stiamo creando sarà valido per un anno.
  • -newkey: questa opzione creerà la richiesta di certificato e una nuova chiave privata allo stesso tempo. Questo è necessario poiché non abbiamo creato una chiave privata in anticipo.
  • rsa: 2048 : dice a OpenSSL di generare una chiave RSA lunga 2048 bit.
  • -keyout: questo parametro indica il file di output nel quale posizionare la chiave generata.
  • -out: questa opzione indica il file di output del certificato generato. 

Quando premi "INVIO", ci verranno poste una serie di domande.

L'elemento più importante richiesto è la riga che legge "Nome comune (ad esempio FQDN del server o TUO nome)". È necessario inserire il nome di dominio che si desidera associare al certificato o l'indirizzo IP pubblico del server se non si dispone di un nome di dominio.

Country Name (2 letter code) [AU]:IT

State or Province Name (full name) [Some-State]:Milano

Locality Name (eg, city) []:Milano

Organization Name (eg, company) [Internet Widgits Pty Ltd]:milano.miosito.com

Organizational Unit Name (eg, section) []:Uffici Milano

Common Name (e.g. server FQDN or YOUR name) []:192.168.10.100

Email Address []:Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.

La chiave ed il certificato verranno creati nella directory /etc/apache2/ssl

Configuriamo Apache per l'utilizzo di SSL

Ora che abbiamo disponibili il nostro certificato e la chiave, possiamo configurare Apache per utilizzare questi file in un file host virtuale.

Invece di basare il nostro file di configurazione fuori dal file 000-default.conf nella directory sites- availables, modificheremo il file di configurazione default-ssl.conf che contiene già alcune configurazioni SSL predefinite.

Prima di modificare il file che senza riportare i commenti dovrebbe avere un aspetto simile

 <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>

        BrowserMatch "MSIE [2-6]" \

                        nokeepalive ssl-unclean-shutdown \

                        downgrade-1.0 force-response-1.0

        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

    </VirtualHost>

</IfModule>

Creiamone una copia

sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf_old

Apriamo quindi il file con i privilegi di root digitando

sudo nano /etc/apache2/sites-available/default-ssl.conf

e modifichiamo al suo interno i parametri evidenziati

 <IfModule mod_ssl.c>

    <VirtualHost _default_:443>

        ServerAdmin Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.

        ServerName your_domain.com

        ServerAlias 192.168.10.100

        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLEngine on

        SSLCertificateFile /etc/apache2/ssl/apache.crt

        SSLCertificateKeyFile /etc/apache2/ssl/apache.key

        <FilesMatch "\.(cgi|shtml|phtml|php)$">

                        SSLOptions +StdEnvVars

        </FilesMatch>

        <Directory /usr/lib/cgi-bin>

                        SSLOptions +StdEnvVars

        </Directory>

        BrowserMatch "MSIE [2-6]" \

                        nokeepalive ssl-unclean-shutdown \

                        downgrade-1.0 force-response-1.0

        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

    </VirtualHost>

</IfModule>

Ora che abbiamo modificato il nostro file di configurazione dell’host virtuale abilitandolo per SSL, dobbiamo abilitarlo digitiamo quindi :

sudo a2ensite default-ssl.conf

e riavviamo Apache per caricare le modifiche apportate al file host virtuale:

sudo service apache2 restart

Fatto ciò potremo puntare al nostro server utilizzando il certificato SSL che abbiamo creato.