Autorità di certificazione locale: differenze tra le versioni

nessun oggetto della modifica
mNessun oggetto della modifica
Nessun oggetto della modifica
Riga 1: Riga 1:
==Introduzione==
==Introduzione==
L'utilizzazione di una autorità di certificazione locale (''self signed CA'') trova applicazione in tutti quei casi in cui non sia necessario che una root CA esterna firmi i nostri certificati.
L'utilizzo di un'autorità di certificazione locale (''self signed CA'') trova applicazione in tutti quei casi in cui non sia necessario che una root CA esterna firmi i nostri certificati.


Uno scenario tipico è quello in cui si voglia realizzare un sistema di autenticazione web basato su certificati: per autenticarsi i client devono presentare il certificato richiesto.
Uno scenario tipico è quello in cui si voglia realizzare un sistema di autenticazione web basato su certificati: per autenticarsi i client devono presentare il certificato richiesto.


Illustrerò come generare una CA locale, come usarla per creare certificati
Illustrerò come generare una CA locale, come usarla per creare certificati lato server e lato client, infine mostrerò come revocare un certificato.
lato server e lato client, infine mostrerò come revocare un certificato.


==Installazione e Configurazione di Openssl==
==Installazione e Configurazione di Openssl==
Riga 12: Riga 11:


Per minimizzare la quantità di informazioni richieste durante la creazione di chiavi e certificati, può
Per minimizzare la quantità di informazioni richieste durante la creazione di chiavi e certificati, può
essere utile modificare il file '''/etc/ssl/openssl.cnf''' per esempio alla seguente sezione:
essere utile modificare il file <code>/etc/ssl/openssl.cnf</code> per esempio alla seguente sezione:
<pre>
<pre>
[ req_distinguished_name ]
[ req_distinguished_name ]
Riga 32: Riga 31:


===Creazione della chiave (root CA)===
===Creazione della chiave (root CA)===
Prima del certificato è necessario creare una chiave. Il seguente comando genera nella directory '''/etc/openssl/private''' la chiave privata '''ca.key''' di 1024 bit criptata con algoritmo ''triple DES'':
Prima del certificato è necessario creare una chiave. Il seguente comando genera nella directory <code>/etc/openssl/private</code> la chiave privata <code>ca.key</code> di 1024 bit criptata con algoritmo ''triple DES'':
<pre># openssl genrsa -des3 -out private/ca.key 1024
<pre># openssl genrsa -des3 -out private/ca.key 1024
Enter pass phrase for private/ca.key:
Enter pass phrase for private/ca.key:
Riga 40: Riga 39:
La chiave sarà generata dopo aver immesso la ''pass phrase''.
La chiave sarà generata dopo aver immesso la ''pass phrase''.


{{ warningbox | vista l'importanza della chiave privata a livello sicurezza, dare gli opportuni permessi alla directory '''/etc/openssl/private''' e a '''ca.key'''. }}
{{ warningbox | vista l'importanza della chiave privata a livello sicurezza, dare gli opportuni permessi alla directory <code>/etc/openssl/private</code> e a <code>ca.key</code>. }}


===Generazione del certificato (root CA)===
===Generazione del certificato (root CA)===
Prima di procedere assicurarsi che '''/etc/ssl/index.txt''' sia vuoto e che '''/etc/ssl/serial''' contenga il valore 01.
Prima di procedere assicurarsi che <code>/etc/ssl/index.txt</code> sia vuoto e che <code>/etc/ssl/serial</code> contenga il valore 01.


Utilizziamo la chiave creata nella sezione [[#Creazione della chiave (root CA)|Creazione della chiave (root CA)]], per generare un certificato root CA '''ca.crt''' con validità di un anno:
Utilizziamo la chiave creata nella sezione [[#Creazione della chiave (root CA)|Creazione della chiave (root CA)]], per generare un certificato root CA <code>ca.crt</code> con validità di un anno:
<pre># openssl req -config /etc/ssl/openssl.cnf -new -x509 -key private/ca.key -out ca.crt -days 365
<pre># openssl req -config /etc/ssl/openssl.cnf -new -x509 -key private/ca.key -out ca.crt -days 365
Enter pass phrase for private/ca.key:</pre>
Enter pass phrase for private/ca.key:</pre>
Riga 51: Riga 50:
Il certificato appena creato sarà utilizzato esclusivamente per firmare tutti gli altri certificati generati in seguito.
Il certificato appena creato sarà utilizzato esclusivamente per firmare tutti gli altri certificati generati in seguito.


Affinché i browser possano riconoscere come valida la ''root CA'' appena creata, gli utenti finali dovranno installare il certificato '''ca.crt''' nei loro browser. Riferirsi alla sezione [[#Certificato lato client | Certificazione lato client]] per ottenere maggiori informazioni.
Affinché i browser possano riconoscere come valida la ''root CA'' appena creata, gli utenti finali dovranno installare il certificato <code>ca.crt</code> nei loro browser. Riferirsi alla sezione [[#Certificato lato client | Certificazione lato client]] per ottenere maggiori informazioni.


Aggiungendo l'opzione '''-batch''' al precedente comando potremmo automatizzare l'operazione utilizzando i valori predefiniti impostati nel file '''/etc/ssl/openssl.cnf'''. Utile quando il comando è utilizzato in uno script.
Aggiungendo l'opzione <code>-batch</code> al precedente comando potremmo automatizzare l'operazione utilizzando i valori predefiniti impostati nel file <code>/etc/ssl/openssl.cnf</code>. Utile quando il comando è utilizzato in uno script.


==Certificato lato server==
==Certificato lato server==
Riga 76: Riga 75:
Enter pass phrase for private/server.key:</pre>
Enter pass phrase for private/server.key:</pre>


Impartito il comando, è richiesta in input una serie di informazioni tra cui la più importante è quella relativa all'opzione ''commonName'' in cui va specificato l'''FQDN'' del server che utilizzerà il certificato, al fine di evitare problemi di "fiducia" coi client.
Impartito il comando, è richiesta in input una serie di informazioni tra cui la più importante è quella relativa all'opzione <code>commonName</code> in cui va specificato l'<code>FQDN</code> del server che utilizzerà il certificato, al fine di evitare problemi di "fiducia" coi client.


===Firma della CSR===
===Firma della CSR===
Riga 85: Riga 84:
Enter pass phrase for private/ca.key:</pre>
Enter pass phrase for private/ca.key:</pre>


Il risultato del precedente comando è il file '''/etc/ssl/certs/server.crt''', l'aggiornamento di '''/etc/ssl/index.txt''' e di '''/etc/ssl/serial'''. A questo punto il file '''server.csr''' non è più necessario.
Il risultato del precedente comando è il file <code>/etc/ssl/certs/server.crt</code>, l'aggiornamento di <code>/etc/ssl/index.txt</code> e di <code>/etc/ssl/serial</code>. A questo punto il file <code>server.csr</code> non è più necessario.
Il risultato dell'operazione è il certificato per mezzo del quale il server https cifrerà i dati scambiati con i client.
Il risultato dell'operazione è il certificato per mezzo del quale il server https cifrerà i dati scambiati con i client.


Riga 113: Riga 112:
Affinché ''apache-ssl'' sia informato sulla validità dei certificati, è necessario l'utilizzo delle direttive '''SSLCACertificatePath''' e '''SSLUseCRL'''. La prima indica il percorso in cui cercare la ''CRL'', la seconda istruisce il demone a fare uso della ''CRL''.
Affinché ''apache-ssl'' sia informato sulla validità dei certificati, è necessario l'utilizzo delle direttive '''SSLCACertificatePath''' e '''SSLUseCRL'''. La prima indica il percorso in cui cercare la ''CRL'', la seconda istruisce il demone a fare uso della ''CRL''.


La ''CRL'' deve essere puntata da un link simbolico della forma <tt><hash>.r<number></tt> presente all'interno del percorso indicato dalla direttiva '''SSLCACertificatePath''' (p.e. '''/etc/ssl'''):
La ''CRL'' deve essere puntata da un link simbolico della forma <tt><hash>.r<number></tt> presente all'interno del percorso indicato dalla direttiva '''SSLCACertificatePath''' (p.e. <code>/etc/ssl</code>):
<pre>
<pre>
# cd /etc/ssl
# cd /etc/ssl
Riga 141: Riga 140:
</VirtualHost>
</VirtualHost>
</pre>
</pre>
Quando è revocato un certificato client relativo al virtual host <tt>x.y.z.w</tt>, il risultato potrebbe non corrispondere a quanto voluto. Se si visitasse l'URL <tt>https://x.y.z.w</tt> con il browser in cui è installato il certificato revocato , si noterebbe che l'accesso non verrebbe impedito. Questo accade perché '''SSLOnRevocationSetEnv SSL_REVOKED''' non nega l'accesso ai certificati revocati, ma imposta la variabile '''SSL_REVOKED''' a "YES" e la direttiva posta nel contesto ''server config'' ha valore anche per gli host virtuali.
Quando è revocato un certificato client relativo al virtual host <tt>x.y.z.w</tt>, il risultato potrebbe non corrispondere a quanto voluto. Se si visitasse l'URL <tt>https://x.y.z.w</tt> con il browser in cui è installato il certificato revocato, si noterebbe che l'accesso non verrebbe impedito. Questo accade perché '''SSLOnRevocationSetEnv SSL_REVOKED''' non nega l'accesso ai certificati revocati, ma imposta la variabile '''SSL_REVOKED''' a "YES" e la direttiva posta nel contesto ''server config'' ha valore anche per gli host virtuali.
La soluzione è quella di commentare la direttiva nel contesto ''server config'' e attivarla, se serve, per ogni singolo host virtuale.
La soluzione è quella di commentare la direttiva nel contesto ''server config'' e attivarla, se serve, per ogni singolo host virtuale.


Riga 168: Riga 167:
</pre>
</pre>


a questo punto il file '''client1.csr''' non è più necessario. Infine '''client1.crt''' e '''client1.key''' vanno messi in un unico file:
a questo punto il file <code>client1.csr</code> non è più necessario. Infine <code>client1.crt</code> e <code>client1.key</code> vanno messi in un unico file:
<pre>
<pre>
# cat private/client1.key > private/client1.pem
# cat private/client1.key > private/client1.pem
Riga 182: Riga 181:
</pre>
</pre>


Ovviamente la pass phrase per '''/etc/ssl/private/client1.pem''' è la stessa di '''/etc/ssl/private/client1.key'''. La ''Export Password'' viene richiesta al momento dell'importazione del file ''PKCS'' nel client browser.
Ovviamente la pass phrase per <code>/etc/ssl/private/client1.pem</code> è la stessa di <code>/etc/ssl/private/client1.key</code>. La ''Export Password'' viene richiesta al momento dell'importazione del file ''PKCS'' nel client browser.


===Importazione dei certificati===
===Importazione dei certificati===
I certificati da importare nel browser secondo quanto fin qui descritto sono:
I certificati da importare nel browser secondo quanto fin qui descritto sono:
# '''ca.crt''' - certificato della ''CA'' locale, da importare nella sezione "Autorità". Serve per dare "fiducia" al sito web della LAN.
# <code>ca.crt</code> - certificato della ''CA'' locale, da importare nella sezione "Autorità". Serve per dare "fiducia" al sito web della LAN.
# '''client1.p12''' - certificato dell'utente finale da importare nel browser.
# <code>client1.p12</code> - certificato dell'utente finale da importare nel browser.


==Revoca di un certificato==
==Revoca di un certificato==
Riga 202: Riga 201:
Enter pass phrase for private/ca.key:
Enter pass phrase for private/ca.key:
</pre>
</pre>
Il rudimentale database '''/etc/ssl/index.txt''' è aggiornato marcando il certificato come revocato. Risultano revocati tutti quei certificati che in '''/etc/ssl/index.txt''' presentano una lettera '''R''' come primo campo.
Il rudimentale database <code>/etc/ssl/index.txt</code> è aggiornato marcando il certificato come revocato. Risultano revocati tutti quei certificati che in <code>/etc/ssl/index.txt</code> presentano una lettera '''R''' come primo campo.


===Creazione e aggiornamento di una CRL===
===Creazione e aggiornamento di una CRL===
Per conoscere quali certificati sono stati revocati, è necessario generare una ''CRL'' (''Certificate Revocation List''). Una ''CRL'' è una lista che dichiara quali certificati sono stati revocati e la motivazione della revoca.
Per conoscere quali certificati sono stati revocati, è necessario generare una ''CRL'' (''Certificate Revocation List''). Una ''CRL'' è una lista che dichiara quali certificati sono stati revocati e la motivazione della revoca.
<pre># openssl ca -config openssl.cnf -gencrl -out crl/crl.pem</pre>
<pre># openssl ca -config openssl.cnf -gencrl -out crl/crl.pem</pre>
Il comando precedente crea una ''CRL'' in base alle informazioni contenute in '''/etc/ssl/index.txt''' e deve essere impartito ogni volta che uno o più certificati sono revocati.
Il comando precedente crea una ''CRL'' in base alle informazioni contenute in <code>/etc/ssl/index.txt</code> e deve essere impartito ogni volta che uno o più certificati sono revocati.


Dopo aver aggiornato una ''CRL'', è sempre necessario riavviare ''apache-ssl'' per rendere effettivi i cambiamenti.
Dopo aver aggiornato una ''CRL'', è sempre necessario riavviare ''apache-ssl'' per rendere effettivi i cambiamenti.
1 508

contributi