1 508
contributi
S3v (discussione | contributi) mNessun oggetto della modifica |
Nessun oggetto della modifica |
||
Riga 1: | Riga 1: | ||
==Introduzione== | ==Introduzione== | ||
L' | 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 | 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 | 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 | {{ 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 | 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 | 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 | 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 | 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 | 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 | 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. | 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 | 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 | 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: | ||
# | # <code>ca.crt</code> - certificato della ''CA'' locale, da importare nella sezione "Autorità". Serve per dare "fiducia" al sito web della LAN. | ||
# | # <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 | 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 | 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. |
contributi