Creazione di una Certification Authority con CentOS/Fedora (Parte II)

Continuando il discorso iniziato nell’articolo precedente, di seguito riportiamo i comandi necessari per installare una propria Certification Authority creata con OpenSSL.

Quasi tutte le installazioni di Linux (Fedora e CentOS compresi) fanno uso di OpenSSL. Per accertarsi che sia installato è sufficiente scrivere nella shell:

OpenSSL

Se tutto è ok comparirà il prompt dei comandi del programma (per uscire scrivere quit e premere invio).

Chi dovesse installare il pacchetto può scrivere invece:

yum install openssl

A differenza di altre distribuzioni, in Red Hat i files di configurazione di OpenSSL risiedono nella cartella “/etc/pki/tls”. Il primo passo consiste nel creare una nuova directory dove conservare tutti i files necessari alla nostra CA. Per non incorrere in problemi dovuti alle policy di selinux, in questo esempio utilizzeremo la cartella “/etc/pki/CA” (l’utente può usare comunque un altro percorso).

Una volta scelta la destinazione è necessario creare alcune sottocartelle:

  • certs – cartella in cui verranno sistemati i certificati;
  • crl – cartella dedicata alla revoca dei certificati;
  • newcerts – cartella utilizzata da openssl per creare i certificati nella forma non criptata
  • private – cartella contenente le chiavi private. Questa cartella dovrebbe essere di sola lettura e trattata con estrema cura dal momento che contiene la parte più intima della CA.

Oltre alle cartelle, bisogna creare alcuni file:

  • index.txt – file che fungerà da database;
  • serial – file che contiene il numero progressivo dei certificati segnati;
  • crlnumber – (facoltativo) contiene il numero successivo da utilizzare nella lista dei certificati revocati;

Per comodità, di seguito trovate i comandi necessari per creare l’ambiente:

cd /etc/pki/CA
mkdir certs crl newcerts private
touch index.txt
echo "01" > serial
chmod 0755 *

Fatto questo, passiamo alla modifica del file di configurazione openssl.cnf che si trova nella cartella /etc/pki/tls. Prima di procedere oltre però sarebbe bene fare una copia di backup.

[ CA_default ]
  dir = /etc/pki/CA
  x509_extensions = v3_ca
  countryName_default = IT
  stateOrProvinceName_default = Calabria
  0.organizationName_default = Catanzaro

In alto abbiamo riportato solo le righe che sono state modificate.

Per quanto concerne il parametro x509_extensions vi sono alcune considerazioni da fare. Si tratta di un parametro che indica quale sezione del file di configurazione prendere in considerazione quando vengono creati i certificati (relativamente alle estensioni x509). Poichè la sezione usr_cert (valore di default) contiene alcuni parametri che devono essere correttamente impostati per creare certificati validi in ambiente MS-Windows, si è preferito sostituirla con v3_ca che non necessita di personalizzazioni; ricordiamo che questo articolo non tratta tutti gli argomenti relativi al file di configurazione di openssl.

Se non sono state apportate modifiche al file di configurazione diverse da quelle specificate in precedenza, per creare una CA è sufficiente impartire il seguente comando:

openssl req -config /etc/pki/tls/openssl.cnf \
    -new -x509 -days 7200 -keyout /etc/pki/CA/private/cakey.pem \
    -out /etc/pki/CA/cacert.pem

É ovvio che i percorsi indicati nel comando devono rispecchiare la configurazione altrimenti il certificato non verrà utilizzato dal sistema operativo. Il certificato creato avrà una durata di 20 anni, probabilmente è un periodo di tempo eccessivo.

A questo punto viene richiesta una pass phrase ed i campi del certificato:

Generating a 1024 bit RSA private key
.................++++++
.........++++++
writing new private key to '/etc/pki/CA/private/cakey.pem'
Enter PEM pass phrase:
Verifying - 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) [GB]:IT
State or Province Name (full name) [Berkshire]:Catanzaro
Locality Name (eg, city) [Newbury]:Catanzaro
Organization Name (eg, company) [My Company Ltd]:Morzello Blog
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:morzello.com
Email Address []:noreply@morzello.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:ScegliUnaPassword
An optional company name []:Morzello Blog

La pass phrase non deve essere intesa come una password, in effetti viene rischiesta una “frase segreta” che dorà essere custodita con cura.

La challenge password invece viene usata per evitare le la chiave privata venga conservata in chiaro sul disco.

Creazione dei certificati

La creazione dei certificati è relativamente semplice e si compone di due fasi: nella prima viene fatta una richiesta di certificazione mentre nella seconda la richiesta viene segnata digitalmente.

In linea di principio non c’è differenza tra i certificati emessi per un server e quelli emessi per un client; a variare è l’uso che se ne fa del certificato. In genere, la chiave privata del certificato non viene conservata in chiaro ma viene anch’essa sottoposta a crittografia mediante la richiesta di una password. Nel caso di servizi server però questa politica è difficilmente applicabile poichè all’avvio del server tipicamente non vi è nessuno in gradi di digitare una password. Conservare la password in chiaro non ha senso e quindi i certificati per i server non contemplano la crittografia per la chiave privata.

Richiesta di certificati server

OpenSSL può essere utilizzato anche per emettere le richieste di certificazione. Di seguito vediamo un esempio applicabile ai certificati server:

openssl req -config /etc/pki/tls/openssl.cnf -new -nodes -days 730 \
     -keyout /etc/pki/CA/private/new.key \
     -out /etc/pki/CA/newcerts/new_req.pem

Il parametro -nodes evita proprio che il certificato venga sottoposto a crittografia triple des.

Dopo aver eseguito il comando si procederà con la compilazione dei campi necessari:

Generating a 1024 bit RSA private key
........++++++
..........++++++
writing new private key to '/etc/pki/CA/private/new.key'
-----
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) [GB]:IT
State or Province Name (full name) [Berkshire]:Italy
Locality Name (eg, city) [Newbury]:Torino
Organization Name (eg, company) [My Company Ltd]:Morzello Blog
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www.morzello.com
Email Address []:noreply@morzello.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:test
An optional company name []:

Richiesta di certificati client

Per i client la richiesta è del tutto simile ma in questo caso, possiamo usare la crittografia a protezione della chiave privata:

openssl req -config /etc/pki/tls/openssl.cnf -new -days 730 \
     -keyout /etc/pki/CA/private/new.key \
     -out /etc/pki/CA/newcerts/new_req.pem

A titolo esemplificativo riportiamo l’output del comando precedente:

Generating a 1024 bit RSA private key
.++++++
.......++++++
writing new private key to '/etc/pki/CA/private/new.key'
Enter PEM pass phrase:
Verifying - 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) [GB]:IT
State or Province Name (full name) [Berkshire]:Calabria
Locality Name (eg, city) [Newbury]:Catanzaro
Organization Name (eg, company) [My Company Ltd]:Morzello Blog
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:client.morzello.com
Email Address []:noreply@morzello.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:test
An optional company name []:

Come è possibile notare, in questo caso viene richiesta una pass phrase per il certificato.

Firmare digitalmente le richieste

Dopo aver creato la richiesta possiamo passare alla sua firma (sign). Per farlo possiamo usare la nostra CA:

openssl ca -config /etc/pki/tls/openssl.cnf \
     -policy policy_anything \
     -out /etc/pki/CA/certs/new.crt \
     -infiles /etc/pki/CA/newcerts/new_req.pem

Il risultato sarebbe del tutto simile al seguente:

Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jun 30 09:18:53 20xx GMT
            Not After : Jun 30 09:18:53 20yy GMT
        Subject:
            countryName               = IT
            stateOrProvinceName       = Calabria
            localityName              = Catanzaro
            organizationName          = Morzello Blog
            commonName                = client.morzello.com
            emailAddress              = noreply@morzello.com
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                0A:AF:2C:D3:55:29:86:33:FC:D2:9A:A4:AF:90:42:AB:BD:17:01:29
            X509v3 Authority Key Identifier:
                keyid:30:16:68:ED:CD:61:20:61:F3:D0:BA:17:35:2A:74:87:E4:D3:A1:32
                DirName:/C=IT/ST=Calabria/L=Catanzaro/O=Vittorio Benintende/CN=client.morzello.com/emailAddress=noreply@morzello.com
                serial:09:DB:34:A3:DA:3F:56:BC

            X509v3 Basic Constraints:
                CA:TRUE
Certificate is to be certified until Jun 30 09:18:53 20xx 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

A questo punto possiamo eliminare la richiesta:

rm /etc/pki/CA/newcerts/new_req.pem

Verifiche e test sui certificati

Per visualizzare le informazioni relative ad un certificato basta indicare gli argomenti che interessano, come ad esempio: l’emittente, la data di scadenza, l’hash md5, il fingerprint, …

openssl x509 -noout -subject -issuer -enddate -hash -fingerprint -in /etc/pki/CA/certs/new.crt

Il parametro -noout indica ad openssl che non c’è un output da gestire.

Per verificare la validità di un certificato si può utilizzare il comando:

openssl verify -CAfile /etc/pki/CA/cacert.pem /etc/pki/CA/certs/new.crt
/etc/pki/CA/certs/new.crt: OK

Installare i certificati in Windows

In Windows l’installazione dei certificati merita un po’ di attenzione perchè è necessario fare una conversione se si utilizza l’esempio riportato in alto. Per metabolizzare il certificato infatti Windows ha bisogno del formato PKCS#12. Per ottenere questo possiamo utilizzare il seguente comando:

openssl pkcs12 -export -in /etc/pki/CA/certs/new.crt \
-inkey /etc/pki/CA/private/new.key -out /etc/pki/CA/certs/new.p12 -clcerts

A questo punto viene eventualmente richiesta la password per l’esportazione del certificato.

Per importare i certificati e le CA all’interno del sistema operativo basta cliccare sul file e seguire le istruzioni del wizard proposte a video. Un certificato può essere installato per il singolo utente o per la macchina (con credenziali amministrative).

Se si desidera avere maggior controllo si può invece utilizzare la Microsoft Management Console (mmc.exe)  aggiungendo l’apposito snap-in:

file -> aggiungi/rimuovi snap-in...
aggiungi -> certificati -> account del computer

Dovreste trovarvi in una situazione simile a quella riportata in foto:


Alla prossima.

Leave a comment

2 Comments.

  1. Ciao, grazie alla tua guida ho creato al mia CA ed il mio primo certificato ssl.
    Una domanda: con i vari browser ho sempre il lucchetto rosso sbarrato e il warning che dice:
    “miosito utilizza un certificato di sicurezza non valido.

    Il certificato non è attendibile in quanto il certificato dell’autorità emittente non è attendibile.

    (Codice di errore: sec_error_untrusted_issuer)”

    Sai se ho magari sbagliato a creare la CA o se questo è inevitabile con una CA “fatta in casa”? Grazie mille.

  2. Ciao Lele,
    trattandosi di una self-signed CA è del tutto normale. Il senso del lucchetto rosso è da leggere in questo modo: “Il sito espone un certificato ssl segnato con una CA per la quale io (browser) non sono in grado di verificarne l’autenticità.” Ottieni questo messaggio perchè la tua CA non è stata segnata da altre CA presenti nel tuo PC come ad esempio le CA di Verisign. Se hai seguito la guida allora avrai una Root CA (self-signed) per la quale non esiste un’altra CA a monte usata per certificarne la validità. Per risolvere il problema, dovresti importare la tua CA su tutti i client indicando che “ti fidi” della tua CA e che la ritieni “affidabile”. Fatto questo non vedrai più alcun lucchetto sbarrato quando accedi al sito.

Leave a Reply


[ Ctrl + Enter ]