Howto OpenSSL

Da PtLUG Wiki.

Jump to: navigation, search

Contents

Introduzione

Lo scopo di questa guida è quello di mettere insieme le informazioni che sono state raccolte da alcuni HowTo trovati su diversi siti (il wiki di Ubuntu, il sito HowToForge ecc...) e sintetizzare in pochi passi tutte le operazioni necessarie per poter utilizzare SSL con le applicazioni piu' comuni. Questa guida non ha quindi la pretesa di essere completa o di spiegare in dettaglio tutte le opzioni che andremo ad usare, per le quali si rimanda alla documentazione ufficiale. La configurazione che andremo ad analizzare è stata utilizzata su un sistema Debian (testing) ed il suo impiego su altre distribuzioni potrebbe richiedere alcuni adattamenti.

Cos'è OpenSSL

SSL sta per Secure Socket Layer ed è un protocollo che è stato sviluppato originariamente dalla Netscape in modo da poter trasmettere in maniera sicura dati sensibili, come ad esempio password o numeri di carte di credito. SSL utilizza un algoritmo a chiave privata per cifrare i dati che vengono trasmessi fra due PC. La chiave privata viene invece trasmessa in modo sicuro tramite un algoritmo a chiave pubblica. L'utilizzo piu' comune di SSL è nei web server, ma trova ampio utilizzo anche in altri tipi di applicazioni, come ad esempio LDAP o i server di posta elettronica.

X.509

E' una specifica per i certificati digitali, pubblicata dalla International Telecommunications Union - Telecommunication (ITU-T). Descrive quali sono le informazioni e gli attributi necessari ad una persona o ad un computer per poter essere identificato ed è utilizzato per la distribuzione dei certificati digitali.

Installazione dei pacchetti

Per installare OpenSSL su un sistema debian-based occorre semplicemente questo comando (come utente root):

apt-get install openssl

Certificati SSL

Quando si crea un certificato digitale possiamo scegliere se farlo riconoscere da una Certification Authority globalmente riconosciuta oppure se creare noi stessi una Certification Authority. Se quello che serve a noi è solo un meccanismo per cifrare con SSL le nostre comunicazioni, andrà benissimo una CA (certification authority) creata da noi, mentre se volessimo mettere in piedi ad esempio un attività di commercio elettronico, dovremo rivolgerci ad una CA globalmente riconosciuta. In questa guida andremo a creare sia il certificato che la certification authority.

Creare la Certificate Authority

Prima di iniziare la creazione di tutto quello che ci occorre è consigliabile preparare tutto l'ambiente all'interno della propria $HOME directory:

cd && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCA

Creiamo poi il database iniziale con alcuni valori predefiniti:

echo '01' > serial  && touch index.txt

Adesso dobbiamo creare un nuovo file chiamato caconfig.cnf all'interno della cartella myCA/ con il seguente contenuto:

# Default configuration to use  when one
# is not provided on the command line.
#
[ ca ]
default_ca      = local_ca
#
#
# Default location  of  directories  and
# files needed to generate certificates.
#
[ local_ca ]
dir             = /home/<username>/myCA
certificate     = $dir/cacert.pem
database        = $dir/index.txt
new_certs_dir   = $dir/signedcerts
private_key     = $dir/private/cakey.pem
serial          = $dir/serial
#       
#
# Default   expiration   and  encryption
# policies for certificates.
#
default_crl_days        = 365
default_days            = 1825
default_md              = md5
#       
policy          = local_ca_policy
x509_extensions = local_ca_extensions
#       
#
# Default policy to use  when generating
# server   certificates.  The  following
# fields  must  be defined in the server
# certificate.
#
[ local_ca_policy ]
commonName              = supplied
stateOrProvinceName     = supplied
countryName             = supplied
emailAddress            = supplied
organizationName        = supplied
organizationalUnitName  = supplied
#       
#
# x509 extensions to use when generating
# server certificates.
#
[ local_ca_extensions ]
subjectAltName          = DNS:ptlug.org
basicConstraints        = CA:false
nsCertType              = server
#       
#
# The default root certificate
# generation policy.
#
[ req ]
default_bits    = 2048
default_keyfile = /home/<username>/myCA/private/cakey.pem
default_md      = md5
#       
prompt                  = no
distinguished_name      = root_ca_distinguished_name
x509_extensions         = root_ca_extensions
#
#
# Root  Certificate  Authority   distinguished 
# name.  Change these fields to match
# your local environment!
#
[ root_ca_distinguished_name ]
commonName              = Pistoia Linux User Group
stateOrProvinceName     = PT
countryName             = IT
emailAddress            = info@ptlug.org
organizationName        = PtLUG
#       
[ root_ca_extensions ]
basicConstraints        = CA:true

Prima di salvare il file occorre modificare alcune cose: sostituite <username> con il nome del vostro utente dal quale state creando il certificato (nel mio caso era andy80 ), poi modificate la sezione root_ca_distinguished_name, cancellando i valori predefiniti ed inserendo i vostri.

A questo punto dovete impostare una varibile di ambiente che servirà ad openssl per sapere dove trovare la configurazione:

export OPENSSL_CONF=~/myCA/caconfig.cnf

Adesso potete generare la CA con il seguente comando:

openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825

Vi verrà chiesto di inserire una passphrase, mi raccomando NON DIMENTICATELA! Questa passphrase vi verrà chiesta ogni volta che vorrete compiere una qualsiasi operazione con il certificato oppure quando vorrete avviare dei servizi che richiedano l'uso di tale certificato.

Dovremmo avere due nuovi file all'interno della nostra cartella di lavoro:

  • ~/myCA/cacert.pem
  • ~/myCA/private/cakey.pem

che sono rispettivamente il certificato CA pubblico e la chiave privata.

Creazione di un Certificato

Adesso che abbiamo configurato la CA, possimo generare il nostro certificato. Per prima cosa dobbiamo creare il file ~/myCA/exampleserver.cnf ed inserire le nostre informazioni in maniera simile a quanto scritto sotto:

#
# exampleserver.cnf
#

[ req ]
prompt                  = no
distinguished_name      = server_distinguished_name

[ server_distinguished_name ]
commonName              = ptlug.gotdns.org
stateOrProvinceName     = PT
countryName             = IT
emailAddress            = info@ptlug.org
organizationName        = PtLUG
organizationalUnitName  = Pistoia Linux User Group

N.B: il commonName deve corrispondere esattamente al nome dell'host al quale ci si sta collegando, altrimenti ad i client apparirà un avviso che dirà loro che il certificato potrebbe essere stato rubato o cose simili.

Una volta salvato il file, dobbiamo provvedere ad esportare di nuovo una variabile di ambiente:

export OPENSSL_CONF=~/myCA/exampleserver.cnf

Adesso generiamo il certificato e la chiave:

openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM

Esportiamo la chiave privata in un file temporaneo:

openssl rsa < tempkey.pem > server_key.pem

e poi la rinominiamo:

mv tempkey.pem server_key.pem

Ora dobbiamo firmare il certificato appena generato tramite la nostra CA, prima di farlo dobbiamo esportare di nuovo un'altra variabile di ambiente:

export OPENSSL_CONF=~/myCA/caconfig.cnf

ed in seguito:

openssl ca -in tempreq.pem -out server_crt.pem

A questo punto possiamo rimuovere i file temporanei:

 rm -f tempkey.pem && rm -f tempreq.pem

Dovremmo così avere due nuovi file:

  • server_crt.pem
  • server_key.pem

che sono rispettivamente il nostro certificato e la chiave del certificato.

N.B: la chiave privata server_key.pem è a sua volta cifrata. Questo significa che ogni volta che dovremo avviare un'applicaziobe configurata con quel certificato SSL, dovremo manualmente inserire la passphrase. In ambienti dove ad esempio sono necessari dei riavvii automatici dei servizi senza che ci sia bisogno dell'intervento di un operatore, è consigliabile (anche se meno sicuro) esportare la chiave in un file non cifrato, con questo comando:

openssl rsa -in server_key.pem -out server_key_un.pem

Supporto SSL per le applicazioni

Dopo aver generato la propria CA ed il certificato digitale, possiamo finalmente iniziare ad usare il nostro certificato all'interno dei vari servizi.

Apache 2

Uno dei principali servizi dove SSL trova largo impiego è quello dei webserver. Abilitare il supporto SSL su Apache, come vedremo, non è complicato. Le cose iniziano a complicarsi nel caso in cui si richiedano configurazioni particolari o miste, come ad esempio abilitare il supporto solo per alcuni siti o per alcune pagine. Nel nostro caso andremo ad analizzare due situazioni: quella in cui tutti i siti web predefiniti saranno consultabili solo tramite connessione SSL e quella in cui distingueremo due cartelle separate sul server nelle quali ospitare le pagine protette e quelle non protette.

N.b: la configurazione che segue si riferisce ad un'installazione di Apache2 su una Debian (testing).

Per prima cosa occorre abilitare il modulo SSL:

ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled/
ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ 

Poi dobbiamo editare il file /etc/apache2/mods-enabled/ssl.conf ed aggiungere le seguenti righe prima della fine del modulo:

SSLCertificateFile /home/andy80/myCA/server_crt.pem
SSLCertificateKeyFile /home/andy80/myCA/server_key_un.pem

Ora dobbiamo editare il file /etc/apache2/ports.conf e fare in modo che Apache2 gestisca il traffico della porta 443, quindo dovremo aggiungere la seguente riga in fondo al file:

Listen 443

A questo punto dobbiamo dire ad Apache2 di abilitare il supporto SSL per le pagine che vogliamo proteggere. Come già accennato, per la prima configurazione proteggeremo tutte le pagine del webserver, aggiungengo SSLEngine on all'interno del file /etc/apache2/sites-available/default

<VirtualHost *>
        ServerAdmin webmaster@localhost
        SSLEngine on

Altrimenti possiamo aggiungere, sempre all'interno dello stesso file, una sezione come questa:

NameVirtualHost 192.168.0.2:443
ServerName 192.168.0.2
<VirtualHost 192.168.0.2:443>
        ServerAdmin info@ptlug.org
        SSLEngine on
        DocumentRoot /var/www/secdocs
        <Directory /var/www/secdocs>
                Options FollowSymLinks
                Options ExecCGI
                AddHandler cgi-script .cgi
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
</VirtualHost>

In questo modo tutti i documenti che si troveranno all'interno di /var/www/secdocs saranno inviati tramite protocollo SSL.

A questo punto non ci resta che riavviare Apache2 tramite questo comando:

/etc/init.d/apache2 restart

Apache2 è adesso configurato per il supporto SSL.

Autore

Questa guida è stata scritta da Andrea Grandi.

Riferimenti