next up previous contents
Next: La configurazione lato server Up: Configurazione Previous: Configurazione   Contents


La creazione dei certificati

Per poter usare SSL occorre fornire al server un certificato valido. Se poi si vuole anche avere l'autenticazione del server da parte dei client e viceversa occorre anche creare una CA (Certification Authority che firmi i certificati delle varie macchine.

Per far questo si possono usare gli strumenti forniti con SSL; il pacchetto Debian relativo è openssl che contiene l'omonimo programma, più uno script in perl, /usr/lib/ssl/misc/CA.pl, che permette di semplificare la creazione della CA, facendo da interfaccia ad openssl per la gestione delle varie operazioni che eseguiremo con la nostra personale CA.

In generale è buona norma creare i certificati e le chiavi su una macchina dedicata, non connessa alla rete e tenuta in luogo sicuro. L'accesso alle chiavi della CA permette infatti di compromettere tutte le comunicazioni. Non disponendo di una macchina dedicata ho eseguito l'operazione su un portatile isolato dalla rete, ho salvato tutti i file su un dischetto, stampando per ulteriore precauzione certificati e chiavi, poi ho cancellato il tutto (usando wipe, installabile dall'omonimo pacchetti, per maggior sicurezza).

Lo script genera i certificati usando alcuni valori predefiniti che sono impostati all'inizio dello stesso. In particolare può essere interessante modificare la durata del certificato cambiando il valore della variabile $DAYS, che viene utilizzata per specificare di quanti giorni deve essere la validità del certificato generato. Modificare la riga relativa in:

$DAYS="-days 1095";
permette di specificare tre anni (1095 giorni) al posto dell'anno (365 giorni) utlizzato come valore predefinito.

Il primo passo della procedura è quello di creare certificati e chiavi per la nostra nuova Certification Authority personale. Questo si fa con l'opzione -newca, l'output del comando è:

[root@havnor software]# /usr/lib/ssl/misc/CA.pl -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Using configuration from /usr/lib/ssl/openssl.cnf
Generating a 1024 bit RSA private key
...................++++++
.................++++++
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:IT
State or Province Name (full name) [Some-State]:Italia
Locality Name (eg, city) []:Firenze
Organization Name (eg, company) [Internet Widgits Pty Ltd]:GaPiL
Organizational Unit Name (eg, section) []:Hacking Lab.
Common Name (eg, YOUR name) []:roke.gnulinux.it
Email Address []:piccardi@gnulinux.it
premendo invio si genera un certificato con il nome standard. Lo script richiede poi una password per la chiave segreta della CA, che va confermata. Infine si devono immettere le informazioni previste dallo standard X.509, che saranno riportate nel certificato, procedendo come mostrato nell'uscita a video del comando riportata qui sopra. Tutti i file verranno creati in una sottodirectory ./demoCA di quella in cui si esegue lo script: la chiave segreta verrà creata in ./demoCA/private/cakey.pem ed il certificato con la chiave pubblica in ./demoCA/cacert.pem.

Il passo seguente è quello di creare i certificati per ciascuna macchina che dovrà essere autenticata. Se si vuole semplicemente assicurarsi una trasmissione criptata questo non è necessario e basta creare un certificato per il server, lo diventa qualora si intenda autenticare il server presso i client e viceversa.

Il primo passo per creare un nuovo certificato, è quello di generare un certificato di richiesta; questo si fa usando l'opzione -newreq, l'output del comando è:

[root@havnor software]# /usr/lib/ssl/misc/CA.pl -newreq 
Using configuration from /usr/lib/ssl/openssl.cnf
Generating a 1024 bit RSA private key
...............++++++
...........++++++
writing new private key to 'newreq.pem'
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:IT
State or Province Name (full name) [Some-State]:Italia
Locality Name (eg, city) []:Firenze 
Organization Name (eg, company) [Internet Widgits Pty Ltd]:GaPiL        
Organizational Unit Name (eg, section) []:Hacking Lab.
Common Name (eg, YOUR name) []:roke.gnulinux.it
Email Address []:piccardi@gnulinux.it

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Request (and private key) is in newreq.pem
lo script prima chiede la password per la chiave privata, da confermare, poi passa alla richiesta dei dati dello standard X.509 da inserire nel certificato. In questo caso occorre essere precisi nella definizione del Common Name, esso infatti deve corrispondere esattamente al FQDN (Fully Qualified Domain Name, il nome completo dell'estensione di domino) della macchina su cui si installerà il certificato, altrimenti l'autenticazione non funzionerà.

Alla fine delle operazioni il certificato di richiesta e la chiave privata ad esso associata saranno memorizzati nel file newreq.pem. Si può controllare il certificato di richiesta con il comando:

openssl req -text -noout < newreq.pem

Una volta creato il certificato di richiesta, questo deve essere firmato dalla Certification Authority, in modo da ottenere un certificato valido. Questo si fa con l'opzione -sign, l'output del comando è:

[root@havnor software]# /usr/lib/ssl/misc/CA.pl -sign 
Using configuration from /usr/lib/ssl/openssl.cnf
Enter PEM pass phrase:
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName           :PRINTABLE:'IT'
stateOrProvinceName   :PRINTABLE:'Italia'
localityName          :PRINTABLE:'Firenze'
organizationName      :PRINTABLE:'GaPiL'
organizationalUnitName:PRINTABLE:'Hacking Lab.'
commonName            :PRINTABLE:'roke.gnulinux.it'
emailAddress          :IA5STRING:'piccardi@gnulinux.it'
Certificate is to be certified until Aug 12 14:42:10 2003 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem
il comando chiederà la password della CA per firmare il certificato, e chiederà conferma riguardo la firma e la memorizzazione del nuovo certificato (lo script mantiene tutti i file necessari alla CA per tenere traccia dei vari certificati firmati, che vanno in ./demoCA/newcerts). Il certificato firmato sarà salvato nel file newcert.pem.

Perché slapd possa usare il certificato occorre però anche la sua chiave privata, e, non potendo essere effettuata una richiesta di password nel lancio di un demone, questa deve essere fornita in chiaro, pertanto occorrerà convertire la chiave contenuta in newreq.pem, che è crittata, con il comando:

[root@havnor software]# openssl rsa < newreq.pem > newkey.pem
dando la password del certificato. Si tenga presente che il file newkey.pem contiene la chiave provata in chiaro, e pertanto deve essere protetto scrupolosamente, cambiandone immediatamente in permessi in 400 (sola lettura per il proprietario) ed assegnato a root.

Qualora si voglia usare una macchina che ha più nomi la cosa si complica, con SSL non è possibile infatti usare più certificati. In tal caso allora occorre far uso di una estensione prevista dallo standard X.509v3, che permette di specificare in uno stesso certificato nomi alternativi. Questo comporta alcune modifiche alla procedura appena illustrata.

Anzitutto occorre settare openssl perché quando si firmano i certificati in essi venga inserito il campo relativo ai nomi alternativi. Questa procedura purtroppo non si può automatizzare3 per cui per ciascun certificato si dovrà editare il file di configurazione di openssl (in Debian è /etc/ssl/openssl.cnf).

Quello che va fatto, prima di firmare il certificato di richiesta,4 è di inserire nella sezione [ usr_cert ] di openssl.cnf una riga analoga alla seguente:

subjectAltName = DNS:ldap.gnulinux.it,DNS:*.replica.gnulinux.it
dove si indica la lista di nomi alternativi, che deve essere specificata con il suddetto formato, inserendo la lista separata da virgole dei FQDN, preceduti dall'indicatore l'indicatore DNS:5 oppure, come nell'esempio, specificando tutto un sottodominio con il metacarattere *.

In questo modo, una volta firmato il certificato, il nome alternativo sarà inserito nel file newcert.pem, dove potremo verificare la presenza di un campo aggiuntivo del tipo:

            X509v3 Subject Alternative Name: 
                DNS:ldap.gnulinux.it



Footnotes

... automatizzare3
perlomeno non sono riuscito a trovare una modalità che lo permettesse.
... richiesta,4
lo si può fare anche prima di creare la richiesta, la cosa è ininfluente al fine di avere il valore nel certificato finale.
...DNS:5
si possono usare anche altri indicatori, come email: o URL: quando il certificato viene usato per pagine web o indirizzi di posta elettronica, e questi vari tipi di indicatori possono essere mescolati fra loro.

next up previous contents
Next: La configurazione lato server Up: Configurazione Previous: Configurazione   Contents
Simone Piccardi 2002-09-28