Come visto nelle lezioni precedenti, per poter attivare il protocollo HTTPS sul proprio server è necessario dotarsi di un certificato SSL. I certificati SSL vengono rilasciati dalle Certification Authority (o CA), degli organismi riconosciuti a livello globale il cui compito è quello di attestare l'identità di un server e del suo proprietario. Per maggiori dettagli vi rimandiamo ad un articolo sul processo di richiesta di un certificato SSL, disponibile su HTML.it.
Come si evince, le CA ricoprono un ruolo centrale nell'implementazione degli schemi di autenticazione SSL/TLS. Esse agiscono da garante super partes al quale i client (ad esempio i browser web) si affidano per verificare l'identità del server al quale si collegano. Un certificato rilasciato da una CA nota e fidata è considerato un certificato valido. Viceversa, un certificato rilasciato da una CA sconosciuta verrà considerato non attendibile.
Perché generare i propri certificati?
In alcune circostanze può essere utile utilizzare dei certificati generati manualmente al posto di certificati rilasciati da una authority. Generare i propri certificati consente di ridurre i costi, azzerare i tempi di attesa per il rilascio del certificato e permette un maggior controllo sui parametri del certificato (dimensione delle chiavi, metadati in esso contenuti, etc). Ovviamente, un certificato autogenerato non verrà accettato dai client, a meno che esso non sia installato manualmente nell'elenco dei certificati considerati attendibili per il client.
Esistono dei casi in cui questa limitazione è accettabile. Ad esempio, un'applicazione mobile che utilizzi HTTPS per interrogare un server remoto potrebbe essere distribuita insieme al certificato autogenerato del server stesso. In questo caso, l'applicazione utilizzerà il certificato presente al suo interno per effettuare la verifica invece dell'elenco delle CA accettate dal sistema operativo (il Trusted Certificate Store).
Un approccio del genere garantisce allo sviluppatore il totale controllo sull'utilizzo di TLS/SSL da parte della propria applicazione, rendendo quest'ultima immune da eventuali compromissioni ai danni delle CA. Tuttavia, particolare attenzione va rivolta alle modalità con cui il certificato viene distribuito, al fine di evitare eventuali manomissioni.
Generazione del certificato con OpenSSL
Esistono diverse modalità con le quali è possibile generare un certificato SSL in autonomia. Ad esempio, è possibile generare prima i certificati necessari per costruire la propria CA e poi usare l'identità di quest'ultima per generare i certificati SSL, creando così la propria PKI.
Nel caso più semplice, è possibile creare un certificato utilizzando l'utility da riga di comando openssl. Poiché i certificati X.509 si basano sulla crittografia asimmetrica, si procede creando una coppia di chiavi crittografiche: la chiave privata risiede solo sul server, mentre il corrispondente certificato pubblico viene inviato ai client per l'autenticazione.
La generazione della coppia chiave privata - certificato avviene con il comando:
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/miocert.key -out /etc/ssl/certs/miocert.crt
che genererà la chiave miocert.key ed il certificato miocert.crt.
Gli argomenti utilizzati nella riga di comando controllano il comportamento dell'utility openssl:
- req indica il comando opnessl da eseguire. In questo caso, vogliamo effettuare una richiesta di emissione di certificato X.509 (X.509 CSR).
- -x509 specifica che la richiesta CSR verrà eseguita direttamente, invece di essere trasmessa successivamente ad una CA. Questo comando permette quindi la generazione di un certificato autofirmato.
- -nodes disabilita la richiesta di una password per l'accesso alla chiave privata. Poiché la chiave privata sarà utilizzata da Apache la presenza di una password richiederebbe l'inserimento della stessa da parte dell'utente amministratore ad ogni avvio del server.
- -days 365 specifica la durata temporale del certificato (1 anno in questo caso). Alla scadenza il certificato andrà rigenerato.
- -newkey rsa:2048 richiede la generazione di una chiave privata e di un certificato contemporaneamente. Inoltre, specifica l'algoritmo (RSA) e la lunghezza della chiave (2048 bit).
- -keyout specifica il percorso in cui salvare la chiave privata.
- -out specifica il percorso in cui salvare il certificato.
L'utility openssl richiede l'inserimento di alcuni metadati che identificano il server ed il suo proprietario, quali ad esempio, il nome e la posizione dell'azienda proprietaria del server, il nome di dominio FQDN associato al server, l'indirizzo e-mail dell'amministratore, etc.
Country Name (2 letter code) [AU]: IT
State or Province Name (full name) [Some-State]: Italy
Locality Name (eg, city) []:Italy
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Mia Azienda s.r.l.
Organizational Unit Name (eg, section) []: Reparto server
Common Name (e.g. server FQDN or YOUR name) []: miazienda.com
Email Address []:admin@miazienda.com
Dopo aver inserito i parametri richiesti, i file .key e .crt verranno creati nelle directory specificate. A questo punto, è possibile procedere configurando il proprio VirtualHost per utilizzare il certificato appena creato, come visto nella lezione precedente.