Utente:Ianezz/Sandbox1

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

Cos'è, in breve, SSL (e TLS)[modifica | modifica wikitesto]

SSL (o Secure Socket Layer) e TLS (Transport Layer Security) sono protocolli che offrono canali di comunicazione cifrati (per evitare intercettazioni) e con gli estremi autenticati tra loro tramite certificati X.509 (uno o entrambi gli estremi).

In linea di principio essi possono funzionare su un qualunque canale bidirezionale; di fatto vengono usati solo con connessioni TCP.

Cos'è, in breve, un certificato X.509[modifica | modifica wikitesto]

Un certificato X.509 è, molto sbrigativamente, un file che attesta che ad una certa serie di dati (es. nome e cognome, o nome DNS, o altro ancora) è associata una certa chiave pubblica, il tutto solitamente firmato digitalmente con la chiave privata di una Certification Authority.

Un certificato del genere, unitamente alla chiave privata corrispondente alla chiave pubblica nel certificato, serve essenzialmente a dimostrare la propria identità a coloro che si fidano, direttamente o indirettamente, della Certification Authority che ha emesso il cerficato.

Un certificato X.509 non contiene mai chiavi private (tuttavia è possibile impacchettare un certificato e una chiave privata in un unico file, vedi PKCS#10 e file PEM), e da solo non prova alcuna identità. È pensato per essere liberamente distribuibile, visto che non è falsificabile (a meno che la Certification Authority che lo firma non si sia fatta fregare la sua chiave privata...)

Per dimostrare di essere la persona o l'ente indicata nel certificato, occorre avere a disposizione la chiave privata corrispondente alla chiave pubblica indicata nel certificato. Il certificato, come detto sopra, da solo non è sufficiente.

I certificati scadono (ad esempio dopo un anno, dipende dalla CA che li ha emessi), e si possono rinnovare tramite apposita richiesta di rinnovo alla CA.

I certificati possono essere revocati da una CA (se ad esempio viene compromessa la chiave privata della CA). Le liste di revoca (elenchi di certificati revocati) vanno poi diffuse a coloro che utilizzano i certificati per verificare l'identità di una controparte.

Formati dei file[modifica | modifica wikitesto]

I file che contengono le varie chiavi, certificati, etc. sono tipicamente in uno dei formati/codifiche che seguono:

DER (Distinguished Encoding Rules)
è un formato binario
PEM (Privacy Enhanced Mail)
è un formato testuale (ma non leggibile ad un essere umano) che consiste semplicemente nella versione DER codificata in Base64 e aggiungendo righe che marcano l'inizio e la fine dei dati. Grazie a queste ultime è possibile avere ad esempio un singolo file contenente sia un certificato che anche la relativa chiave privata, o anche più certificati e chiavi;

Inoltre esistono anche i seguenti formati:

PKCS#10
è un formato usato per effettuare la richiesta di un certificato ad una Certification Authority;
PKCS#12
è un formato usato per distribuire comodamente dei certificati e chiavi private a degli utenti, che si ritrovano tutto in un unico file che possono importare nel browser/programma di posta/etc. L'intero "pacchetto" viene cifrato con DES o DES3 mediante una passphrase (detta "Export key") la quale deve nuovamente essere digitata dal destinatario quando importa il file nel browser/programma di posta/etc.
JKS (Java Key Store)
è un formato usato nel mondo Java che rappresenta una sorta di "portafogli" di certificati e di chiavi private, globalmente protetto da una password d'accesso (le singole chiavi contenute possono essere a loro volta protette da delle passphrase). File di questo tipo sono gestiti con l'apposito strumento keytool, che permette di importare ed esportare certificati, generare nuove chiavi private e generare le richieste di firma per un nuovo certificato, ma ad esempio non di importare chiavi private esistenti in altri formati (si può fare del codice Java ad hoc per importare un certificato ed una chiave esistente in formato DER).

Generazione di una coppia di chiave pubblica/privata RSA[modifica | modifica wikitesto]

Per generare una nuova coppia di chiavi pubblica/privata RSA da 2048 bit, e salvarla non cifrata in formato PEM nel file "key_unencrypted.private":

 openssl genrsa -out key_unencryped.private 2048

Se invece vogliamo anche cifrare la parte privata della chiave con una passphrase, basta usare ad esempio l'opzione -des3

 openssl genrsa -des3 -out key_encrypted.private 2048

Il tutto è come prima, solo che ora in più ci viene chiesta una passphrase con cui cifrare (via DES triplo) la chiave privata. In seguito, ogni volta che useremo la chiave privata sarà necessario introdurre nuovamente la passphrase per decifrarla al volo.

Se abbiamo una chiave privata RSA cifrata con una passphrase e vogliamo salvarla "in chiaro", basta un comando del tipo

 openssl rsa -in key_encrypted.private -out key_unencrypted.private

Verrà richiesta la passphrase, con cui verrà decifrato il file in input, il quale verrà poi scritto in output senza cifratura.

Generazione di una richiesta certificato PKCS#10[modifica | modifica wikitesto]

La richiesta di un certificato (in gergo CSR -- Certificate Signing Request) si effettua con qualcosa del tipo

  openssl req -key key_encrypted.private -new -out signing_request

se la chiave privata era stata cifrata con una passphrase (l'esempio "key_encrypted.private" lo era), ci viene richiesta la passphrase per decifrarla. Dalla chiave privata viene estratta la parte pubblica, e ci viene quindi richiesta tutta una serie di dati da mettere alla firma.

Tra i dati richiesti quello che conta particolarmente è il "Common Name":

  • per i certificati che attestano l'identità di persone è semplicemente nome e cognome (es. "Mario Rossi")
  • per i certificati che attestano l'identità di un host, è il nome DNS con cui esso verrà contattato (es. "wiki.telecomitalia.it"). È anche possibile richiedere un unico certificato usabile per tutti gli host all'interno di un certo dominio DNS usando un asterisco seguito dal dominio (es. "*.allwikis.telecomitalia.it").

La richiesta viene salvata nel file "signing_request", che è da trasmettere alla Certification Authority per ottenere il certificato desiderato.


Esempio di creazione ed uso di una CA propria[modifica | modifica wikitesto]

Questo è un esempio di come

  1. crearsi una propria CA interna
  2. creare una chiave privata e richiedere un certificato
  3. firmare la richiesta con la propria CA (producendo un certificato)
  4. verificare che il certificato sia firmato dalla propria CA
  5. revocare un certificato

Per creare la CA e per firmare usiamo lo script in Perl "CA.pl" fornito insieme a OpenSSL.

Creazione CA[modifica | modifica wikitesto]

Qui sotto creiamo una nostra Certification Authority (CA), in una directory vuota.

 mianeselli@virtuo:~/provaopenssl/provaCA1$ /usr/lib/ssl/misc/CA.pl -newca
 CA certificate filename (or enter to create)
 
 Making CA certificate ...
 Generating a 1024 bit RSA private key
 ...............++++++
 .++++++
 writing new private key to './demoCA/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) [AU]:IT
 State or Province Name (full name) [Some-State]:TN
 Locality Name (eg, city) []:Trento
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:Telecom Italia
 Organizational Unit Name (eg, section) []:TIS
 Common Name (eg, YOUR name) []:Matteo Ianeselli CA
 Email Address []:matteo.ianeselli@telecomitalia.it
 
 Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password []:
 An optional company name []:
 Using configuration from /usr/lib/ssl/openssl.cnf
 Enter pass phrase for ./demoCA/private/cakey.pem:
 Check that the request matches the signature
 Signature ok
 Certificate Details:
         Serial Number:
             87:54:98:c2:bb:00:ae:1d
         Validity
             Not Before: Oct  4 12:42:49 2007 GMT
             Not After : Oct  3 12:42:49 2010 GMT
         Subject:
             countryName               = IT
             stateOrProvinceName       = TN
             organizationName          = Telecom Italia
             organizationalUnitName    = TIS
             commonName                = Matteo Ianeselli CA
             emailAddress              = matteo.ianeselli@telecomitalia.it
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
                 AD:15:20:F0:64:11:46:1C:9D:AE:D3:4C:FA:98:63:84:78:5C:9A:82
             X509v3 Authority Key Identifier: 
                 keyid:AD:15:20:F0:64:11:46:1C:9D:AE:D3:4C:FA:98:63:84:78:5C:9A:82
                 DirName:/C=IT/ST=TN/O=Telecom Italia/OU=TIS/CN=Matteo Ianeselli CA/emailAddress=matteo.ianeselli@telecomitalia.it
                 serial:87:54:98:C2:BB:00:AE:1D
 
             X509v3 Basic Constraints: 
                 CA:TRUE
 Certificate is to be certified until Oct  3 12:42:49 2010 GMT (1095 days)
 
 Write out database with 1 new entries
 Data Base Updated
 mianeselli@virtuo:~/provaopenssl/provaCA1$ ls -al
 totale 0
 drwxr-xr-x 3 mianeselli mianeselli  72 2007-10-04 14:41 .
 drwxr-xr-x 6 mianeselli mianeselli 216 2007-10-04 14:41 ..
 drwxr-xr-x 6 mianeselli mianeselli 360 2007-10-04 14:42 demoCA


Nuova chiave RSA[modifica | modifica wikitesto]

Qui generiamo una nuova chiave RSA a 2048 bit:

 mianeselli@virtuo:~/provaopenssl/provaCA1$ openssl genrsa -out bid1key.pem 2048
 Generating RSA private key, 2048 bit long modulus
 ......+++
 ..........................................................................................................................................................................................................+++
 e is 65537 (0x10001)
 mianeselli@virtuo:~/provaopenssl/provaCA1$ ls -al
 totale 4
 drwxr-xr-x 3 mianeselli mianeselli  104 2007-10-04 14:43 .
 drwxr-xr-x 6 mianeselli mianeselli  216 2007-10-04 14:41 ..
 -rw-r--r-- 1 mianeselli mianeselli 1675 2007-10-04 14:43 bid1key.pem
 drwxr-xr-x 6 mianeselli mianeselli  360 2007-10-04 14:42 demoCA


Nuova richiesta certificato[modifica | modifica wikitesto]

Qui richiediamo un certificato, usando la chiave generata sopra.

 mianeselli@virtuo:~/provaopenssl/provaCA1$ openssl req -new -key bid1key.pem -out csrbid1.pem
 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]:TN  
 Locality Name (eg, city) []:Trento
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:Telecom Italia
 Organizational Unit Name (eg, section) []:TIS
 Common Name (eg, YOUR name) []:bid1.telecomitalia.it
 Email Address []:bid1@telecomitalia.it
 
 Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password []:
 An optional company name []:
 mianeselli@virtuo:~/provaopenssl/provaCA1$ ls -al
 totale 8
 drwxr-xr-x 3 mianeselli mianeselli  136 2007-10-04 14:44 .
 drwxr-xr-x 6 mianeselli mianeselli  216 2007-10-04 14:41 ..
 -rw-r--r-- 1 mianeselli mianeselli 1675 2007-10-04 14:43 bid1key.pem
 -rw-r--r-- 1 mianeselli mianeselli 1070 2007-10-04 14:44 csrbid1.pem
 drwxr-xr-x 6 mianeselli mianeselli  360 2007-10-04 14:42 demoCA


Firma richiesta[modifica | modifica wikitesto]

Qui firmiamo la richiesta (csrbid1.pem) con la Certification Authority creata all'inizio, e ottieniamo un nuovo certificato.

 mianeselli@virtuo:~/provaopenssl/provaCA1$ mv csrbid1.pem newreq.pem
 mianeselli@virtuo:~/provaopenssl/provaCA1$ /usr/lib/ssl/misc/CA.pl -sign
 Using configuration from /usr/lib/ssl/openssl.cnf
 Enter pass phrase for ./demoCA/private/cakey.pem:
 Check that the request matches the signature
 Signature ok
 Certificate Details:
         Serial Number:
             87:54:98:c2:bb:00:ae:1e
         Validity
             Not Before: Oct  4 12:45:23 2007 GMT
             Not After : Oct  3 12:45:23 2008 GMT
         Subject:
             countryName               = IT
             stateOrProvinceName       = TN
             localityName              = Trento
             organizationName          = Telecom Italia
             organizationalUnitName    = TIS
             commonName                = bid1.telecomitalia.it
             emailAddress              = bid1@telecomitalia.it
         X509v3 extensions:
             X509v3 Basic Constraints: 
                 CA:FALSE
             Netscape Comment: 
                 OpenSSL Generated Certificate
             X509v3 Subject Key Identifier: 
                 10:B5:F4:54:2E:81:59:13:4B:54:E5:D5:65:9E:41:87:90:F1:D0:8B
             X509v3 Authority Key Identifier: 
                 keyid:AD:15:20:F0:64:11:46:1C:9D:AE:D3:4C:FA:98:63:84:78:5C:9A:82
 
 Certificate is to be certified until Oct  3 12:45:23 2008 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
 mianeselli@virtuo:~/provaopenssl/provaCA1$ ls -al
 totale 16
 drwxr-xr-x 3 mianeselli mianeselli  168 2007-10-04 14:45 .
 drwxr-xr-x 6 mianeselli mianeselli  216 2007-10-04 14:41 ..
 -rw-r--r-- 1 mianeselli mianeselli 1675 2007-10-04 14:43 bid1key.pem
 drwxr-xr-x 6 mianeselli mianeselli  432 2007-10-04 14:45 demoCA
 -rw-r--r-- 1 mianeselli mianeselli 4119 2007-10-04 14:45 newcert.pem
 -rw-r--r-- 1 mianeselli mianeselli 1070 2007-10-04 14:44 newreq.pem
 mianeselli@virtuo:~/provaopenssl/provaCA1$ mv newcert.pem bid1cert.pem

Verifica del nuovo certificato[modifica | modifica wikitesto]

Qui verifichiamo la validità del nuovo certificato. Notare l'opzione -CAfile demoCA/cacert.pem, per indicare che ci fidiamo della Certification Authority che ci siamo creati.

 mianeselli@virtuo:~/provaopenssl/provaCA1$ openssl verify -CAfile demoCA/cacert.pem bid1cert.pem 
 bid1cert.pem: OK

Revoca di un certificato[modifica | modifica wikitesto]

La revoca di un certificato si può effettuare con

 mianeselli@virtuo:~/provaopenssl/provaCA1$ openssl ca -gencrl -revoke bid1cert.pem > crl.pem

notare che rimane traccia della revoca nei file della CA, ed anche in momenti successivi è possibile ottenere un elenco di tutti i certificati revocati con

 openssl ca -gencrl > crl.pem

SSL per i programmi che non lo supportano: stunnel[modifica | modifica wikitesto]

Stunnel è un programma che permette di utilizzare connessioni SSL/TLS con programmi che non lo supportano nativamente.

Può funzionare in modalità server, stando in ascolto per connessioni SSL su una data porta (opzione -d) o accettare il traffico da standard input (stile inetd), e passando il traffico in chiaro ad un altro programma da esso avviato (stile inetd).

Può funzionare in modalitå client, stando in ascolto su una data porta (opzione -d) e indirizzando il traffico in chiaro verso un'altra porta di un'altro server (opzione -r).

Esempio uso client[modifica | modifica wikitesto]

Esempio di uso su client (con debug al massimo livello e rimanendo in foreground, così da vedere il traffico e lo scambio di certificati):

  stunnel -D 7 -f -c -r sirio.sodalia.it:443 -d 32431

Collegandosi ad un browser ad http://localhost:32431 (notare: in chiaro) il traffico viene cifrato via SSL/TLS ed arriva a sirio.sodalia.it:443 (che risponde solo in https). È possibile specificare certificato e chiave del client con l'opzione -p file_pem_con_certificato_e_chiave, ed è possibile specificare se verificare il certificato del server con l'opzione -v (di default non viene verificato).

Catturare il traffico SSL: ssldump[modifica | modifica wikitesto]

SSLDump è un programma simile del tutto simile a tcpdump, ma che cattura ed effettua il dump del traffico SSL/TLS. Opzionalmente può anche decodificare il traffico SSL/TLS se gli vengono forniti (come opzioni da riga di comando) i certificati e le chiavi private necessarie.

Esempio[modifica | modifica wikitesto]

    ssldump -A -N -i eth0 port 443

(eseguito come root) effettua il dump del traffico SSL/TLS che arriva sull'interfaccia eth0 destinato alla porta 443.