Product SiteDocumentation Site

10.2. Certificati X.509

I certificat,i sono un elemento fondamentale di molti servizi di rete basati su protocolli crittografici che necessitano di una sorta di autenticazione centrale.
Tra questi protocolli, SSL (Secure Socket Layer) è stato realizzato da Netscape per proteggere le connessioni ai server Web. In seguito è stato standardizzato dall'IETF con l'acronimo TLS (Transport Layer Security). Da allora TLS ha continuato ad evolversi ed oggi SSL è deprecato a causa dei numerosi difetti di progettazione scoperti.
Il protocollo TLS mira, principalmente, a fornire privacy ed integrità dei dati tra due o più applicazioni che stanno comunicando tra loro. Il caso più comune su Internet è la comunicazione tra un client (ad esempio un browser web) ed un server.
Per lo scambio di informazioni è necessaria una coppia di chiavi che prevede una chiave pubblica, che include informazioni sull'identità del proprietario e la corrispondente chiave privata. La chiave privata deve essere mantenuta segreta, altrimenti la sicurezza è compromessa. Tuttavia, chiunque potrebbe creare una coppia di chiavi, impostare una falsa identità e fingere di essere quell'identità. Una soluzione prevede il concetto di Autorità di Certificazione (CA), formalizzata dallo standard X.509. Questo termine indica un'entità che detiene una coppia di chiavi affidabili, nota come root certificate. Questo certificato viene utilizzato solo per firmare altri certificati (coppie di chiavi), dopo che sono stati compiuti passi adeguati per verificare l'identità memorizzata nella coppia di chiavi. Le applicazioni che utilizzano X.509 possono quindi verificare i certificati presentati, se sono a conoscenza dei root certificate affidabili.
Si può implementare un CA (come descritto in Sezione 10.2.2, «Infrastruttura a chiave pubblica: easy-rsa»), ma se si intende usare il certificato per un sito web, è necessario affidarsi a una CA attendibile. I prezzi variano in modo significativo, ma è possibile implementare un'ottima sicurezza spendendo poco o nulla.

10.2.1. Creazione di certificati attendibili gratuiti

Molti programmi creano ed utilizzano, in modo predefinito, certificati snakeoil (vedere riquadro SICUREZZA Certificati SSL Snake oil). Fortunatamente il pacchetto certbot contiene tutto ciò che è necessario per creare propri certificati che possono essere ritenuti affidabili da terzi; è fornito dall'iniziativa "Lets Encrypt" (vedere riquadro CULTURA L'iniziativa Let's Encrypt), questi certificati possono anche essere usati dagli MTA (Mail Transport Agent, come Postfix), MDA (Mail Delivery Agents, come Dovecot, Cyrus, ecc.) e altri servizi di rete.
Gli amministratori di Falcot vogliono soltanto creare un certificato per il loro sito web, eseguito su Apache. C'è un comodo plugin di Apache per certbot che modifica automaticamente la configurazione di Apache per utilizzare il certificato ottenuto, così gli amministratori ne fanno uso:
# apt install python3-certbot-apache
[...]
# certbot --apache
saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): admin@falcot.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:  N

Account registered.

No names were found in your configuration files. Please enter in your domain
name(s) (comma and/or space separated)  (Enter 'c' to cancel): falcot.com

Requesting a certificate for falcot.com
Performing the following challenges:
http-01 challenge for falcot.com
Enabled Apache rewrite module
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/000-default-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/000-default-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/000-default-le-ssl.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Enabled Apache rewrite module
Redirecting vhost in /etc/apache2/sites-enabled/000-default.conf to ssl vhost in /etc/apache2/sites-available/000-default-le-ssl.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://falcot.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=falcot.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/falcot.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/falcot.com/privkey.pem
   Your cert will expire on 2022-06-04. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
Se si preferisce mantenere il server in funzione durante la creazione del certificato, si può usare il plugin webroot per ottenere il certificato con gli argomenti certonly e --webroot. È necessario specificare un --webroot-path (abbreviato -w), che dovrebbe contenere i file rilasciati. Il comando si presenta come segue:
# certbot certonly --webroot -w /var/www/html -d www.DOMINIO.com -d DOMINIO.com
È necessario riavviare tutti i servizi utilizzando i certificati creati.
I certificati creati sono i cosiddetti certificati a vita breve, che hanno una validità di 90 giorni e devono quindi essere rinnovati ogni tre mesi con il comando certbot renew. Tuttavia, non si dovrebbe rinnovare ogni certificato manualmente, ma automaticamente. Un cron job di base è fornito da certbot in /etc/cron.d/certbot. Per assicurarsi che i certificati possano essere rinnovati automaticamente, è possibile eseguire certbot renew --dry-run.

10.2.2. Infrastruttura a chiave pubblica: easy-rsa

È anche possibile creare una propria CA, per la quale utilizzeremo l'algoritmo RSA ampiamente utilizzato nella crittografia a chiave pubblica. Si tratta di una "coppia di chiavi", composta da una chiave privata ed una pubblica. Le due chiavi sono strettamente legate l'una all'altra e le loro proprietà matematiche sono tali che un messaggio cifrato con la chiave pubblica può essere decifrato solo da chi conosce la chiave privata, il che garantisce la riservatezza. In senso opposto, un messaggio cifrato con la chiave privata può essere decifrato da chiunque conosca la chiave pubblica, il che consente di autenticare l'origine di un messaggio, poiché solo chi ha accesso alla chiave privata potrebbe generarlo. Se associato a una funzione di hash (MD5, SHA1 o una variante più recente), questo porta ad un meccanismo di firma che può essere applicato a qualsiasi messaggio.
Dal momento che le CA pubbliche emettono certificati solo in cambio di un (salato) compenso, è anche possibile creare un'autorità di certificazione privata all'interno dell'azienda. Il pacchetto easy-rsa fornisce gli strumenti per fungere da infrastruttura di certificazione X.509, implementati con un insieme di script che utilizzano il comando openssl.
Gli amministratori della Falcot Corp utilizzano questo strumento per creare i certificati richiesti, sia per il server che per i client. Questo permette una configurazione simile di tutti i client, dato che dovranno essere impostati solo per considerare attendibili i certificati provenienti dalla CA locale di Falcot. Questa CA crea il primo certificato; a tal fine, gli amministratori impostano in un luogo appropriato la directory con i file richiesti per la CA, preferibilmente su una macchina non connessa alla rete, per ridurre il rischio di furto della chiave privata della CA.
$ make-cadir pki-falcot
$ cd pki-falcot
Essi memorizzano i parametri richiesti nel file vars, che può essere decommentato e modificato:
$ grep EASYRSA vars
if [ -z "$EASYRSA_CALLER" ]; then
# easyrsa.  More specific variables for specific files (e.g., EASYRSA_SSL_CONF)
#set_var EASYRSA	"${0%/*}"
#set_var EASYRSA_OPENSSL	"openssl"
#set_var EASYRSA_OPENSSL	"C:/Program Files/OpenSSL-Win32/bin/openssl.exe"
#set_var EASYRSA_PKI		"$PWD/pki"
#set_var EASYRSA_TEMP_DIR	"$EASYRSA_PKI"
#set_var EASYRSA_DN	"cn_only"
set_var EASYRSA_REQ_COUNTRY	"FR"
set_var EASYRSA_REQ_PROVINCE	"Loire"
set_var EASYRSA_REQ_CITY	"Saint-Étienne"
set_var EASYRSA_REQ_ORG	"Falcot Corp"
set_var EASYRSA_REQ_EMAIL	"admin@falcot.com"
set_var EASYRSA_REQ_OU		"Certificate authority"
#set_var EASYRSA_KEY_SIZE	2048
#set_var EASYRSA_ALGO		rsa
#set_var EASYRSA_CURVE		secp384r1
#set_var EASYRSA_CA_EXPIRE	3650
#set_var EASYRSA_CERT_EXPIRE	825
#set_var EASYRSA_CRL_DAYS	180
#set_var EASYRSA_CERT_RENEW	30
#set_var EASYRSA_RAND_SN	"yes"
#set_var EASYRSA_NS_SUPPORT	"no"
#set_var EASYRSA_NS_COMMENT	"Easy-RSA Generated Certificate"
#set_var EASYRSA_TEMP_FILE	"$EASYRSA_PKI/extensions.temp"
# when undefined here, default behaviour is to look in $EASYRSA_PKI first, then
# fallback to $EASYRSA for the 'x509-types' dir.  You may override this
#set_var EASYRSA_EXT_DIR	"$EASYRSA/x509-types"
#set_var EASYRSA_KDC_REALM      "CHANGEME.EXAMPLE.COM"
# EASYRSA_PKI or EASYRSA dir (in that order.) NOTE that this file is Easy-RSA
#set_var EASYRSA_SSL_CONF	"$EASYRSA/openssl-easyrsa.cnf"
#set_var EASYRSA_REQ_CN		"ChangeMe"
#set_var EASYRSA_DIGEST		"sha256"
#set_var EASYRSA_BATCH		""
$ vim vars
$ 
Ora prepariamo la directory dell'infrastruttura a chiave pubblica con il seguente comando:
$ ./easyrsa init-pki


init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/debian/pki-falcot/pki

Il passo successivo è la creazione della coppia di chiavi della CA stessa (durante questo step, le due parti della coppia di chiavi saranno memorizzate in pki/ca.crt e pki/private/ca.key). Si può aggiungere l'opzione nopass per evitare di inserire una password ogni volta che si usa la chiave privata:
$ ./easyrsa build-ca nopass

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating RSA private key, 2048 bit long modulus (2 primes)
..................+++++
...............................+++++
e is 65537 (0x010001)
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.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/debian/pki-falcot/pki/ca.crt

A questo punto è possibile creare il certificato ed i parametri Diffie-Hellman necessari per una connessione SSL/TLS lato server. Essi vogliono utilizzarlo per un server VPN (vedere la sezione Sezione 10.3, «Rete privata virtuale (VPN)») identificato dal nome DNS vpn.falcot.com; questo nome viene riutilizzato per i file chiave generati (keys/vpn.falcot.com.crt per il certificato pubblico, keys/vpn.falcot.com.key per la chiave privata):
$ ./easyrsa gen-req vpn.falcot.com nopass

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating a RSA private key
......................................+++++
..........................................................................+++++
writing new private key to '/home/debian/pki-falcot/pki/easy-rsa-5515.0PwyXl/tmp.g1c6u6'
-----
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.
-----
Common Name (eg: your user, host, or server name) [vpn.falcot.com]:

Keypair and certificate request completed. Your files are:
req: /home/debian/pki-falcot/pki/reqs/vpn.falcot.com.req
key: /home/debian/pki-falcot/pki/private/vpn.falcot.com.key


$ ./easyrsa sign-req server vpn.falcot.com

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 825 days:

subject=
    commonName                = vpn.falcot.com


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /home/debian/pki-falcot/pki/easy-rsa-5603.87iCIa/tmp.u8r8Fj
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'vpn.falcot.com'
Certificate is to be certified until May 27 15:26:29 2024 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/debian/pki-falcot/pki/issued/vpn.falcot.com.crt


$ ./easyrsa gen-dh

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
[…]

DH parameters of size 2048 created at /home/debian/pki-falcot/pki/dh.pem

Il passo seguente crea i certificati per i client VPN, è richiesto un certificato per ogni computer o persona autorizzata ad usare la VPN:
$ ./easyrsa build-client-full JoeSmith nopass

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating a RSA private key
...................................+++++
.........................................................................................+++++
writing new private key to '/home/debian/pki-falcot/pki/easy-rsa-5694.DOYwSn/tmp.RKlbOE'
-----
Using configuration from /home/debian/pki-falcot/pki/easy-rsa-5694.DOYwSn/tmp.d5QHAC
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'JoeSmith'
Certificate is to be certified until May 27 15:29:25 2024 GMT (825 days)

Write out database with 1 new entries
Data Base Updated