Certificati e Chiavi

Estensioni di file contenenti certificati tipo X.509 v3/chiavi

.CRT → Indica che all'interno c'è un certificato: Può essere codificato come binario (DER) o come base-64 ascii (PEM)
.CSR → E' il certificate signing request, ciò che mandi alla CA affinchè lo firmi. E' in sostanza la tua chiave pubblica insieme a una tua descrizione
.KEY → E' il file che contiene la chiave. In base all'intestazione potrà essere la chiave privata, pubblica, privata encrypted. Anche la chiave può essere binaria DER o ascii PEM.
.CERT ->Analogo a .crt

 

Encoding di certificati, che a volte vengono anche usate come estensioni

PEM -> Certificato scritto in ascii e codificato base-64 con prefisso -----BEGIN CERTIFICATE-----
DER -> Certificato codificato in binario.

I file .pem non devono necessariamente contenere un certificato, l'estensione pem implica semplicemente che il contenuto del file è base64-encoded (http://it.wikipedia.org/wiki/Base64)

 

Altri formati

Esistono altre tipologie di certificato riconoscibili da diverse estensioni di file, tipo pkcs12 (molto utilizzata in ambiente windows, .pk12/.p12, file a codifica binaria), oppure p7b (contiene solo il certificato, base64 encoded ascii, .p7b/.p7c)
Openssl tramite il comando “openssl pkcs7” oppure “openssl pkcs12” può manipolare e convertire questi certificati..

 

CHIAVI

Quando vai a creare con openssl la chiave privata

il file generato (in questo caso private.key) conterrà sia la chiave pubblica che quella privata. La pubblica la puoi “estrarre” in questo modo:

In realtà la parola estrarre è errata in quanto private.key è solo la chiave privata. La chiave pubblica la desumi, IN QUESTA implementazione di rsa di openssl, dalla chiave privata. La documentazione di openssl parla di “publc part of a private key”

Quando generi la chiave privata con un algoritmo asimmetrico come rsa/dsa puoi criptarla utilizzando un algoritmo simmetrico (aes,des,des3) e inserendo una password

Per esempio

Per togliere la passphrase a una chiave rsa

Encrypted key significa che la chiave ha una password.

 

CERTIFICATI
Un certificato è un elenco di informazioni riferite a una chiave pubblica che è stata firmata da una CA.
Quindi la CA associa alla chiave pubblica di un utente il suo nome e firma (con la sua chiave privata) il tutto. Il risultato è il certificato. Questo processo lo puoi vedere come lo stato che associa un nome alla tua faccia (carta di identità), ciò garantisce che quel nome sei proprio te.
Le informazioni contenenti nel certificato sono varie (C, ST,O,CN, date di scandenza etc) ma sicuramene c'è la chiave pubblica e l'algoritmo usato per crearla (rsa,dsa.) la firma del certificato e l'algoritmo per la firma

Una terza parte utilizza la chiave pubblica della CA per decrittare il certificato e, se ce la fa, allora è certo che quel certificato è stato davvero firmato dall'autorità. Poi ne legge il contenuto ed è sicuro (perchè lo dice la ca) che la chiave pubblica che ci trova dentro è proprio della persona che le altre informazioni che contiene il certificato dicono.
Se poi decide di inizare una comunicazione può usare la chiave pubblica trovata nel certificato per crittare i dati e essere così sicuro che il suo interlocutore (gia verificato) riuscirà a decrittare ciò che sta comunicando

In realtà la firma di una informazione di solito non si fa di tutta l'informazione ma di un hash della stessa, per cui la CA userà una funzione di hash che applicherà al tuo certificato ancora non firmato, applicherà la sua chiave privata all'hash e questa sarà la sua firma che aggiunge al tuo certificato non firmato.
Dato un certificato firmato quindi, un client che lo deve verificare, decritta l'hash con la chiave pubblica della ca, riapplica la stessa funzione di hash sul resto del certificato e, se i 2 hash corrispondono, allora il mittente è chi dice di essere.

Il certificato di una ca ha il campo CA:TRUE ed è firmato da se stessa

Questo per esempio è un certificato di una CA self signed generata coi tools di freeradius.

Le infomazioni che si trovano in un certificato sono conformi allo standard X.509

 

CERTIFICATO SELF SIGNED – A MANO

Genero la coppia di chiavi rsa a 2048bits criptata aes 128

Tolgo la chiave di criptazione

Genero la richieste di firma del certificato tramite la chiave non criptata

Firmo la csr con la mia stessa chiave privata

Mi salvo in un file leggibile delle informazioni sul certificato appena creato

Ora nella directory mi trovo i seguenti file

*In apache sarà sufficente indicare nel file di configurazione

 

Con questo comando crei un certificato self signed in una botta sola (ma ti perdi tutto il divertimento)

PKI – A MANO
Puoi anche crearti la tua PKI (pubic key infrastructure) fingendoti CA e firmando da solo il certificato (come fanno tutte le ca). Poi usi la chiave privata della ca per firmarti tutti gli altri certificati che non sono così self-signed ma signed da una ca che sei te stesso (sottile differenza questa ma sostanziale): Con apache ti basta un certificato self signed, con radius e EAP_TLS ti serve una pki fatta in casa (per esempio)

CA
Mi creo sotto root una directory chiamata certificati/ca

Creo un file di configurazione della ca chiamato ca.cnf

Genero una chiave rsa grossa 2048 bit e cifrata con aes128

Tolgio la cifratura alla chiave

Richiedo e firmo il certificato della mia ca con la chiave appena creata

Guardo il certificato appena creato per essere sicuro che sia davvero una ca

Creo il certificato in formato DER (quello che ho creto (.crt) è in formato pem, default di openssl)

SERVER
Ora mi creo un certificato server e lo firmo con la ca

Creo la chiave come prima

Tolgo la password come prima

Creo una certificate request

La password che viene richiesta (challenge) è quella che dovrà poi inserira la ca.. E' un po' una garanzia che il nostro csr
non venga alterato nel tragitto... In questo non la metto visto che il tragitto è brevissimo.

Firmo il certificato con la chiave privata dalla ca

Vado a vedere cosa ha scritto in index.txt

Ora converto il certificato in formato pem in quanto il crt che ho prodotto col comando ca è un pem arricchico con parti testuali descrittive (text form)

Mi salvo la parte descrittiva (togliendo la parte codificata finale)

Verifico il certificato.

Preparo ora un server web che utilizzi per la parte ssl questo certificato server.
Mi importo nel browser di un client il certificato della ca (usa chrome che firefox fa il sofisticato)
In teoria così facendo, quando col browser punto al server, non dovrei più leggere lamentele che dicono che il certificato del server non è verificato... In pratica poi molti browser si lamenteranno che il certificato importato della ca non "suona bene".

Print Friendly, PDF & Email