HTTPS: dalla generazione del CSR alla configurazione del server

Se state sviluppando un sito web (od una webapp) nel quale devono transitare informazioni sensibili sicuramente avrete la necessità di utilizzare connessioni sicure HTTPS. In questo modo otterete due vantaggi: i client saranno in grado di "identificare" il sito web in maniera sicura ed i dati transiteranno tra il server ed il browser dell'utente in maniera crittografata.

Per utilizzare https, dovrete:

  • Acquistare un certificato SSL (se non lo avete già)
  • Installarlo/configurarlo sul server web

1. ACQUISTO DEL CERTIFICATO SSL

Si trovano certificati SSL di tutti i prezzi e tipi, per cui nella scelta del fornitore avrete l'imbarazzo della scelta. Il modo di procedere è simile per tutti i fornitori, cioè: faccio l'ordine e pago il certificato, genero un CSR, il fornitore verifica la mia identità, mi viene rilasciato il certificato.

1.2 GENERAZIONE DEL CSR

Il CSR è una "richiesta di certificato". Effettueremo la creazione del CSR tramite openssl, utilizzando il seguento comando (tutto su un'unica riga):

openssl req 
-new -newkey rsa:2048 -nodes 
-keyout example.net.key -out example.net.csr

a questo punto dovrete inserire alcuni dati:

Generating a 2048 bit RSA private key
...................................................+++
....................................+++

writing new private key to 'example.net.key'

-----

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]: INSERITE QUI IL CODICE 
DEL VOSTRO STATO, NEL NOSTRO CASO "IT"
State or Province Name (full name) [Some-State]: QUI METTETE 
IL NOME DELLA PROVINCIA (es. "ROMA")
Locality Name (eg, city) []: NOME DELLA CITTA' (es. "ROMA")
Organization Name (eg, company) [Internet Widgits Pty Ltd]: NOME 
DELLA VOSTRA AZIENDA
Organizational Unit Name (eg, section) []: NOME DELL'UNITA'
ORGANIZZATIVA (opzionale)
Common Name (e.g. server FQDN or YOUR name) []: NOME DEL SITO
WEB CHE UTILIZZERA' IL CERTIFICATO SSL 
(es. "EXAMPLE.NET", oppure "*.EXAMPLE.NET" per i certificati wildcard)
Email Address []: LA VOSTRA E-MAIL


Please enter the following 'extra' attributes
to be sent with your certificate request

A challenge password []: LASCIATE VUOTO QUESTO CAMPO
An optional company name []: LASCIATE VUOTO QUESTO CAMPO

il comando precedente oltre al CSR (nel file example.net.csr) genera in maniera contestuale la vostra chiave privata di 2048 bit (nel file example.net.key).

A questo punto dovrete inviare, secondo le modalità previste dal fornitore, il solo file CSR (NON inviate la chiave privata, questa la dovrete avere soltanto voi!)

1.3 VERIFICA DELL'IDENTITA'

Qui le modalità potrebbero variare molto, in base al fornitore scelto. Si va dalle verifiche esclusivamente online (es viene verificato sul WhoIs che il proprietario del dominio corrisponda a chi ha effettuato l'ordine, o viene richiesto di mettere un determinato file sul proprio sito web, etc) a quelle fisiche.

1.4 RICEZIONE DEL CERTIFICATO

Una volta verificata la vosta identità vi verrà consegnato il vostro certificato (chiamiamolo example.net.crt), ed il certificato del fornitore (chiamiamolo fornitore.crt). Questi due files insieme al file contenente la vostra chiave privata (example.net.key - lo abbiamo generato insieme al CSR) sarà tutto quello che vi serve per la configurazione del server web.

2. CONFIGURAZIONE DEL SERVER WEB

Adesso che abbiamo in mano il nostro certificato, dobbiamo solo metterlo sul server e configurare l'ambiente. 
Supponiamo di utilizzare Apache Httpd come server web, con il modulo modSSL: dovremo solo andare a modificare la configurazione del virtual host (se usate debian/ubuntu trovate tutti i virtual host nella directory /etc/apache2/sites-available) aggiungendo un virtual host per la porta 443 (quella usata da https)
 
NameVirtualHost example.net:443
<VirtualHost example.net:443>
        .... etc ....
        SSLEngine on
        SSLCertificateFile /path/del/vostro/certificato/example.net.crt
        SSLCertificateKeyFile /path/della/vosta/chiave/privata/example.net.key
        SSLCertificateChainFile /path/del/certificato/del/fornitore/fornitore.crt
        .... etc ....
</VirtualHost>
 
a questo punto riavviate apache e provate se funziona!
 

NOTE

Ho cercato di semplificare molto un argomento che in realtà è molto più vasto. Fate attenzione alla differenza tra certificati "standard" e quelli "wildcard": nei certificati standard indicheremo esattamente l'host ed dominio che lo utilizzerà, mentre in quelli wildcard indicheremo solo il dominio per cui ogni host di quel dominio potrà utilizzarlo. Faccio qualche esempio:

(1) Certificato ordinario WWW.EXAMPLE.NET: questo certificato potrà essere utilizzato solo ed esclusivamente su sito WWW.EXAMPLE.NET

(2) Certificato WildCard *.EXAMPLE.NET: potremo installare il certificato su EXAMPLE.NET, WWW.EXAMPLE.NET, MAIL.EXAMPLE.NET, QUALUNQUENOME.EXAMPLE.NET, etc...