Come usare OpenSSL per firmare le e-mail

10 anni fa

7 minuti


Mia mamma spesso riceve e-mail da amiche o colleghe che sono chiaramente spam o virus. Ogni volta deve chiedere a me, “ma posso cliccare qui?”, “ma secondo te me l’ha mandato lei?” e roba simile.

Il mondo sarebbe sicuramente un posto migliore se ogni utente di internet prendesse la buona abitudine di certificare il proprio account di posta. Un po’ perché eviterebbe che la gente rompa il cazzo a noi per capire se una mail è buona o no, un po’ perché fa figo avere la mail firmata (forse, ma dico forse, solo per noi nerd è una figata).

Vi espongo di seguito due metodi per ottenere un certificato per firmare le mail, uno a livello Poppante e uno da Nerd Boss. Infine vedremo come usare questi certificati.

1. Metodo Poppante: fa tutto la mamma
Mi faccio certificare la casella di posta da una Certification Authority, magari gratuita. Questo servizio è ad esempio offerto su IstantSSL da Comodo.
Basta registrarsi e in pochi secondi si riceve una mail con il link del certificato da scaricare.

2. Metodo Nerd Boss: autocertificazione via OpenSSL
OpenSSL è un progetto opensource che ha lo scopo di sviluppare librerie che implementino le funzionalità di SSL (versione 2 e 3), TSL (versione 1) e algoritmi di crittografia simmetrica e asimmetrica. La versione attuale è la 1.0.0d.
[more]
OpenSSL è composta da tre parti principali:
libssl.a: libreria che contiene l’implementazione e le funzioni utili al corretto funzionamento di SSLv2, SSLv3 e TLSv1, lato client o server;
libcrypto.a: libreria che contiene le funzioni crittografiche e le funzioni di gestione dei certificati;
openssl: un tool a linea di comando che permette di utilizzare la maggior parte delle funzioni presenti in libcrypto.a.

Nei sistemi unix-like OpenSSL dovrebbe essere già installato, su Windows sarà necessario scaricarlo dal sito ufficiale. Avendo soltanto Mac, il resto dell’articolo sarà spiegato per OSX, ma poco cambia per le altre piattaforme.
[/more]
Per prima cosa verifichiamo se e quale versione abbiamo installata sulla macchina. Aprite il terminale (se non sapete cos’è o come aprirlo andate in bagno a piangere per almeno 10 minuti, grazie) e digitate:
$ openssl version
Riceverete una risposta tipo “OpenSSL 0.9.8l 5 Nov 2009”, che per i nostri scopi è più che sufficiente.
Se invece o non è installato o la versione è stantia e volete aggiornarla, spiego brevemente cosa fare.
[more]Scaricate l’ultima versione e scompattatela:
$ tar -zxvf openssl-1.0.0d.tar.gz
Di default il pacchetto si installa in /usr/local/openssl. Se volete cambiare il path basta usare il comando:
$ ./config --openssldir=~/quellochevuoitu/openssl/
Se invece vi va bene il percorso di default è sufficiente:
$ ./config
È ora di iniziare l’installazione:
$ make
$ make install

Al termine della procedura dovreste essere in grado di accedere alla shell e verificare se è tutto ok. Proviamo con qualche semplice comando
$ openssl
OpenSSL> rand -base64 100

dovreste ottenere una stringa di caratteri casuali.
Bene, a questo punto siamo pronti ad usare OpenSSL per crearci i nostri certificati!
[/more]
OpenSSL ci mette a disposizione una serie di metodi per creare e gestire una Public Key Infrastructure.
I certificati emessi con le PKI create con OpenSSL rispettano lo standard X.509 e possono essere usati per server e persone.

La prima cosa da fare per creare la propria PKI consiste nel creare il certificato relativo alla root CA. Più precisamente è necessario creare una coppia di chiavi ed un certificato autofirmato relativo alla chiave pubblica.

Per creare la chiave privata della CA si usa il comando genrsa
$ openssl genrsa -des3 -out CA-key.pem 4096
[more]La chiave privata della CA va protetta. Il comando -des3 specifica che vogliamo usare il Triple DES per cifrare la chiave. Nel procedimento di creazione vi verrà chiesta una pass phrase che servirà ad usare la chiave. È necessario che sia sicura e segreta.
-out indica in quale file salvare la chiave e il numero, nel nostro caso 4096, sono i bit di lunghezza della chiave. Credo sia il massimo consentito nello standard e largamente sufficiente per evitare un attacco a forza bruta.[/more]

La prossima cosa da fare è creare il certificato di chiave pubblica relativo alla CA; il comando da utilizzare è req.
$ openssl req -key CA-key.pem -new -x509 -days 365 -out CA-cert.pem
[more]
La spiegazione dei parametri è questa:
-key CA-key.pem: indica quale chiave privata utilizzare per la generazione del certificato;
-new: indica che si tratta di un nuovo certificato;
-x509: indica di generare un certificato in formato X.509;
-days 365: indica che il certificato avrà validità per 365 giorni. È meglio non esagerare con la durata per non compromettere la sicurezza del certificato.
-out CA-cert.pem: indica in quale file salvare il certificato.

Dopo aver lanciato il comando appena indicato verranno richiesti i dati relativi al certificato che si intende creare. Vi riporto per completezza un possibile esempio di compilazione
Country Name (2 letter code): IT
State or Province Name (full name): Italia
Locality Name (eg, city): Torino
Organization Name (eg, company): Lega Nerd
Organizational Unit Name (eg, section): Lega nè
Common Name (eg, YOUR name): Ryan Vespucci
Email Address: ryan_vespucci@hotmail.com
[/more]

Molto bene. Siamo a metà dell’opera. Abbiamo creato la nostra CA personale autofirmata. Ora è il momento di prendere i panni di noi stessi e creare una chiave privata per il nostro utente possessore della e-mail da certificare e una richiesta di certificazione alla CA.
L’utente che desidera ottenere un certificato crea quindi la propria chiave privata e successivamente crea una richiesta di certificato che contiene:

1. La chiave pubblica da certificare
2. I dati dell’utente che richiede il certificato

La richiesta di certificato viene firmata con la chiave privata del richiedente. Questo permette alla CA di essere certa che l’utente sia in possesso della chiave privata corrispondente alla chiave pubblica che sta certificando!

Passiamo ai comandi. La generazione della chiave avviene come abbiamo già visto in precedenza (comando genrsa).
La generazione della richiesta avviene nuovamente tramite il comando req.
$ openssl genrsa -des3 -out Ryan-key.pem 4096
$ openssl req -key Ryan-key.pem -new -out Ryan-req.pem

Si noti che, a differenza dei parametri utilizzati in precedenza, non sono presenti le opzioni –x509 –days ###, poiché si sta generando una richiesta di certificato e non un certificato. Durante la generazione della richiesta, viene chiesto all’utente di specificare i dati relativi al certificato. È fondamentale che Common Name e Email Address siano corretti o va tutto in vacca.

Siamo quasi alla fine! Rimettiamo per l’ultima volta il costume da supereroe della CA e rilasciamo il certificato che andremo poi ad utilizzare. L’operazione avviene tramite l’utilizzo del comando x509
$ openssl x509 -days 365 -CA CA-cert.pem -CAkey CA-key.pem -CAcreateserial -CAserial ca.srl -req -in Ryan-req.pem -out Ryan-cert.pem
[more]
La spiegazione dei parametri è la seguente:
-days ###: indica per quanti giorni il certificato sarà valido;
-CA CA-cert.pem: indica il file del certificato della CA;
-CAkey CA-key.pem: indica il file della chiave privata della CA;
-CAcreateserial: indica che è necessario creare il numero seriale per il certificato – UTILIZZARE SOLO AL PRIMO RILASCIO;
-CAserial ca.srl: indica il file che contiene il seriale da ultimo certificato rilasciato;
-req: indica che il file in input è una richiesta di certificato;
-in Ryan-req.pem: indica il file della richiesta;
-out Ryan-cert.pem: indica il file in cui salvare il certificato;
[/more]
Hell yeah! Abbiamo un certificato. Il problema è che la maggior parte dei MUA vuole in ingresso un certificato in formato PKCS#12. Questo formato è utile per salvare in un unico file il certificato di chiave pubblica e la chiave privata cifrata.

Per la conversione possiamo usare il comando pkcs12.
$ openssl pkcs12 -in Ryan-cert.pem -inkey Ryan-key.pem -export -out Ryan-cert.p12
È fatta! Il file .p12 può essere importato assieme al certificato della CA nel Keyring di OSX (o, ad esempio, nel gestore di certificati di Thunderbird). Il MUA da questo momento in poi sarà automaticamente in grado di firmare le e-mail inviate dall’account specificato nel certificato. Win!
[more]
PS: a questo punto, se certificate qualche vostro amico con la stessa CA, potete scambiare e-mail cifrate possedendo il certificato del destinatario. Dopodiché i servizi segreti verrano a bussare alla vostra porta per sapere come mai.

PPS: nell’immagine ho scritto “Security Project” perché mi piacerebbe fare una serie di post dedicati alla crittografia o più in generale alla sicurezza informatica.
[/more]

via le lezioni giù al Dipartimento di Informatica.
more info: openssl.org, S/MIME.

Windows 11 arriverà in futuro anche su Mac?
Windows 11 arriverà in futuro anche su Mac?
Instagram, scoperta grave vulnerabilità: hacker controllano lo smartphone con una foto
Instagram, scoperta grave vulnerabilità: hacker controllano lo smartphone con una foto
Zoom diventa più sicuro: arriva l'autenticazione a due fattori
Zoom diventa più sicuro: arriva l'autenticazione a due fattori
Windows 10 si aggiorna: corrette 129 vulnerabilità
Windows 10 si aggiorna: corrette 129 vulnerabilità
Twitter, falla nella sicurezza sull'app Android
Twitter, falla nella sicurezza sull'app Android
Ex hacker della NSA rivela gravi vulnerabilità nella versione Mac di Zoom
Ex hacker della NSA rivela gravi vulnerabilità nella versione Mac di Zoom
Google Assistant su PC grazie a XDA
Google Assistant su PC grazie a XDA