Apache + SSL Rendiamo sicure le nostre connessioni ● Principi (molto) base di crittografia ● Certificati digitali ● Formato dei certificati X509 ● Certificate Revocation List (CRL) ● Autenticazione lato Server ● Autenticazione lato Client
Principi di crittografia La crittografia è una scienza che si preoccupa di sviluppare metodi (algoritmi) finalizzati a nascondere il contenuto di un messaggio tramite l'uso di una “chiave” crittografica
Principi di crittografia Nella crittografia a chiave segreta (o condivisa) i due componenti principali sono le funzioni di cifratura che trasformano i testi in chiaro in testi cifrati e la chiave condivisa, conosciuta esclusivamente dal mittente e dal destinatario
Principi di crittografia
Il problema della distribuzione delle chiavi è stato risolto tramite l'introduzione di un nuovo tipo di crittografia, la crittografia a chiave pubblica. Ogni attore ha a disposizione due chiavi: ● Una chiave pubblica (K + ) da distribuire a tutti coloro con cui vuole comunicare ● Una chiave privata (K - ) da tenere segreta e non comunicare a nessuno Ovviamente le due chiave devono essere legate tra loro da vincoli matematici
Principi di crittografia Un messaggio può essere cifrato da chiunque conosca la chiave pubblica del destinatario, ma può essere decifrato solo da chi conosce la chiave privata (il destinatario stesso)
Principi di crittografia
Problema 1 La crittografia a chiave pubblica è molto dispendiosa da un punto di vista computazionale. La cifratura di messaggi (o dati) di grandi dimensioni può richiedere molto tempo
Principi di crittografia Soluzione Sistema della busta digitale: ➔ Viene generata una chiave segreta utilizzabile una sola volta (chiave di sessione) ➔ Si cifra l'intero messaggio con la chiave di sessione ➔ Si cifra la chiave di sessione con la chiave pubblica del destinatario ➔ Si invia la “busta” al destinatario
Principi di crittografia Problema 2 Come faccio ad essere sicuro che la chiave pubblica che sto usando appartiene al legittimo destinatario e che non è stata manomessa?
Principi di crittografia Soluzioni 1 – Sistema della rete di fiducia (GPG) 2 – Sistema “gerarchico” basato su Certification Authority (OpenSSL)
Certificati Digitali La soluzione al problema della distribuzione delle chiavi adottata dallo standard OpenSSL è quella del certificato digitale
Certificati Digitali La chiave pubblica viene registrata da un'autorità che gode della fiducia di entrambe le parti, la Certification Authority La CA “certifica” che la chiave pubblica appartiene al proprietario
Certificati Digitali Le chiavi pubbliche vengono rilasciate dalla CA sotto forma di certificati digitali. Il certificato viene quindi presentato all'interlocutore il quale, fidandosi della CA, identifica il proprietario della chiave pubblica
Formato dei certificati X509 ● Version: Le varie versioni del certificato (v1, v2 o v3) ● Serial Number: Un valore intero univoco assegnato al certificato ● Signature Algorithm identifier: Algoritmo usato per firmare il certificato ● Issuer Name: Il nome della CA ● Period of validity: data di inizio e fine validità ● Subject Name: L'utente a cui fa riferimento il certificato
Formato dei certificati X509 ● Subject's public key info: Algoritmo usato e chiave pubblica del soggetto ● Issuer Unique Identifier: Identificatore unico della CA ● Subject Unique Identifier: Identificativo unico del soggetto ● Extensions: Estensioni ● Signature: Firma della CA
Certificate Revocation List Cosa succede se : ● Perdo la mia chiave privata ● Cambio i dati anagrafici ● La chiave privata viene compromessa
Certificate Revocation List È necessario revocare il certificato (Renderlo inutilizzabile)
Autenticazione lato server Per prima cosa è necessario creare un certificato Due strade: ● Affidarci ad una CA esistente (a pagamento) ● Creare un certificato self-signed e “impersonificare” una CA
Autenticazione lato server Scegliamo (ovviamente) la seconda Per prima cosa generiamo le chiavi pubblica e privata della “nostra” CA openssl genrsa -out CA_key.key 2048
Autenticazione lato server E ora il certificato Self-Signed della CA openssl req -outform PEM -out CA_crt.pem -text - new -key CA_key.key -x509 -days 3650
Autenticazione lato server Occorre ora creare il certificato del server vero e proprio Per prima cosa generiamo le chiavi e la richiesta di certificazione sempre tramite openSSL openssl genrsa -out server_key.key 1024 openssl req -new -out server_cert.csr -key server_key.key
Autenticazione lato server Vestiamo nuovamente i panni della CA e firmiamo la richiesta per creare il certificato vero e proprio openssl x509 -days 365 -CA CA/CA_cert.pem -CAkey CA/CA_key.key -CAcreateserial -CAserial CA/ca.srl -req -in server_cert.csr -outform PEM -text -out server_cert.pem
Autenticazione lato server Per fare in modo che il browser riconosca la nostra CA è necessario inserire il certificato self-signed nella lista delle autorità di certificazione (dipende da browser a browser)
Autenticazione lato server È ora necessario copiare il certificato e la chiave del server in una directory “sicura” ovvero non accessibile al webserver ad esempio /etc/apache2/ssl/
Autenticazione lato server Passiamo ora alla configurazione di apache Per prima cosa è necessario abilitare le estensioni ssl inserendo dei link simbolici nella cartella /etc/apache2/mods-enabled cd /etc/apache2/mods-enabled/ ln -s /etc/apache2/mods-available/ssl.conf ssl.conf ln -s /etc/apache2/mods-available/ssl.load ssl.load
Autenticazione lato server E ora aggiungiamo un VirtualHost in /etc/apache2/apache2.conf e diciamo al server di ascoltare anche sulla porta 443 (https) (nota: su distribuzioni diverse da Debian/Ubuntu... il file di configurazione è /etc/apache2/httpd.conf)
Autenticazione lato server All'interno del nostro Virtual Host inseriamo queste opzioni SSLEngine ON SSLCertificateFile percorso_certificato SSLCertificateKeyFile percorso_chiave_privata
Autenticazione lato client Per prima cosa creiamo (e firmiamo) un certificato per i client che desideriamo autenticare openssl genrsa -out client_key.key 1024 openssl req -new -out client_cert.csr -key client_key.key openssl x509 -days 365 -CA CA/CA_cert.pem -CAkey CA/CA_key.key -CAserial CA/ca.srl -req -in client_cert.csr -outform PEM -text -out client_cert.pem
Autenticazione lato client Per poter inserire il certificato utente all'interno del browser è necessario convertirlo in formato PKCS#12 sempre tramite openSSL openssl pkcs12 -export -in client_cert.pem -inkey client_key.key -name "user1" -out client_cert.p12
Autenticazione lato client Ora dobbiamo inserire queste direttive nella sezione Virtual Hosts di Apache SSLVerifyClient require SSLCACertificateFile /etc/apache2/ssl/CA_cert.pem