Utente:Ianezz/Sandbox1
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
- crearsi una propria CA interna
- creare una chiave privata e richiedere un certificato
- firmare la richiesta con la propria CA (producendo un certificato)
- verificare che il certificato sia firmato dalla propria CA
- 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.