Requisiti
Si desidera configurare un servizio server su Internet che fornisca connessioni crittografate SSL o TLS (ad esempio HTTPS, POP3S, IMAPS, LDAPS, SMTP con TLS).
La difficoltà
Per offrire una connessione protetta con SSL/TLS, è necessario un certificato del server. Questo deve essere firmato da un'autorità di certificazione (CA).
Un certificato server ufficiale, firmato da un'autorità ufficiale, purtroppo non è gratuito. Nella maggior parte dei casi, si dovrà pagare un canone annuale di diverse centinaia di euro.
Una possibile soluzione
In ambiente Linux, è possibile creare una propria CA con gli strumenti presenti di default, e quindi creare e firmare i propri certificati. Si tratta di una procedura di pochi minuti. Tutti i dettagli della procedura sono descritti in questo articolo.
In questo caso, l'unica differenza rispetto a un certificato firmato da un'autorità riconosciuta è che il client (programma di posta elettronica, browser, ecc.) emetterà un avviso di non riconoscimento della CA. L'utente deve confermarlo solo una volta e può quindi accettare il certificato nonostante l'avviso.
Procedura dettagliata
1. Installare OpenSSL
OpenSSL è quasi sempre utilizzato in Linux per la gestione dei certificati e per la crittografia delle connessioni con SSL e TLS. Per questo motivo è probabilmente già installato sul tuo sistema. In caso contrario, è necessario installare il pacchetto openssl
. Da questo pacchetto è necessario il comando a riga di comando openssl
.
2. Creare la CA
Creare innanzitutto una directory in cui memorizzare il certificato. Nel nostro esempio usiamo /root/ca
:
root@linux# mkdir /root/ca
root@linux# cd /root/ca
La validità è stata deliberatamente fissata a 10 anni. Se la CA scade, tutti i certificati dei server firmati con essa non sono più validi. La CA contiene una chiave segreta che viene generata automaticamente e memorizzata nel file cakey.pem
. Il certificato della CA viene scritto in cacert.pem
. Il comando seguente genera una chiave con una lunghezza di 2048 bit per il certificato:
root@linux# openssl req -new -x509 -newkey rsa:2048 -keyout cakey.pem -out cacert.pem -days 3650
Generating a 2048 bit RSA private key
..............................................................
..............................................................
.........................................+++
......................................+++
writing new private key to 'cakey.pem'
Chiunque conosca la chiave segreta della CA può utilizzarla per firmare qualsiasi certificato del server. Per questo motivo, il file della chiave non è memorizzato in chiaro sul disco rigido, ma è criptato con una passphrase. Questa passphrase sarà sempre necessaria se si desidera emettere nuovi certificati con la CA:
Enter PEM pass phrase: wrzlprmpft
Verifying - Enter PEM pass phrase: wrzlprmpft
A questo punto verrà richiesto di inserire i dati che identificano la CA. Questi dati verranno visualizzati dal cliente quando gli verrà chiesto di accettare o rifiutare il certificato. Il codice per la Germania è DE. Se si desidera lasciare vuoto un campo, inserire un punto. Altrimenti, si inserisce il valore predefinito tra parentesi quadre:
-----
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]: DE
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:Muenchen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Hinz und Kunz AG
Organizational Unit Name (eg, section) []:.
Il campo Common Name
(CN) è il nome ufficiale dell'ente di certificazione. Per la propria CA è sufficiente inserire il proprio nome:
Common Name (eg, YOUR name) []: Adam Hinz
Email Address []: adam@hinzag.eu
Fatto. Sono stati creati i due file seguenti:
root@linux# ll
insgesamt 9
drwxr-xr-x 2 root root 112 2006-04-30 12:08 .
drwx------ 12 root root 600 2006-04-30 11:54 ..
-rw-r--r-- 1 root root 1212 2006-04-30 12:08 cacert.pem
-rw-r--r-- 1 root root 963 2006-04-30 12:08 cakey.pem
Per precauzione, è necessario impostare i diritti in modo che solo root
possa leggere il file delle chiavi:
root@linux# chmod 600 cakey.pem
A questo punto è possibile verificare se è possibile riaprire la chiave utilizzando la passphrase:
root@linux# openssl rsa -in cakey.pem -noout -text
Enter pass phrase for cakey.pem: wrzlprmpft
Private-Key: (1024 bit)
modulus:
00:d5:a5:37:51:e9:d9:fa:e3:97:e7:46:b2:88:1a:
b5:46:80:47:76:14:ae:2b:8b:3e:35:5c:ab:15:84:
53:d9:63:2e:7f:08:4b:ec:77:db:02:45:f8:c7:46:
58:cd:2d:f9:29:4d:96:3d:d8:6c:5d:9f:79:8a:04:
cf:b7:3a:89:da:a9:63:9f:44:b3:83:cf:0d:70:7d:
ecc.
3. Generare la chiave per il certificato del server
Ora che abbiamo la nostra CA, si può finalmente emettere un certificato per il nostro server. Per prima cosa generiamo una chiave RSA lunga 2048 bit, che viene crittografata con AES 128 e memorizzata sul disco (sì, davvero, di nuovo una chiave crittografata). La passphrase non deve essere molto segreta questa volta, perché la rimuoveremo comunque in seguito. Tuttavia, OpenSSL non consente una frase vuota:
root@linux# openssl genrsa -out serverkey.pem -aes128 2048 -days 3650
Generating RSA private key, 2048 bit long modulus
....+++
.......................................+++
e is 65537 (0x10001)
Enter pass phrase for serverkey.pem: jaja
Verifying - Enter pass phrase for serverkey.pem: jaja
In questo modo. Ora rimuoviamo nuovamente la passphrase. Perché? Dopo tutto, il servizio del server (Apache, Cyrus, ecc.) deve essere in grado di leggere la chiave senza il vostro intervento. Oppure volete dover inserire una password a ogni avvio del server?
root@linux# openssl rsa -in serverkey.pem -out serverkey.pem
Enter pass phrase for serverkey.pem: jaja
writing RSA key
4. Generare la richiesta di firma del certificato
Il passo successivo per ottenere il proprio certificato è un CSR. Questa deve essere firmata solo dalla CA. Anche in questo caso, i dettagli sono richiesti allo stesso modo della creazione della CA, cosa che spesso genera confusione. I dati generali possono essere inseriti come sopra:
root@linux# openssl req -new -key serverkey.pem -out req.pem -nodes
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]: DE
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:Muenchen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Hinz und Kunz AG
Organizational Unit Name (eg, section) []:.
ATTENZIONE: qui arriva la parte importante: Nel certificato del server, il Common Name è di fondamentale importanza. Deve contenere il nome DNS con cui il client si rivolge al server! Se il certificato viene utilizzato per una connessione HTTPS a www.hinzag.eu
, il Common Name deve essere esattamente www.hinzag.eu
altrimenti il browser non accetterà il certificato, perché penserà di essere approdato al server sbagliato.
Common Name (eg, YOUR name) []: www.hinzag.eu
Email Address []: adam@hinzag.eu
Le altre opzioni possono essere lasciate semplicemente in bianco:
A challenge password []:
An optional company name []:
A questo punto ci saranno già quattro file nella nostra directory:
root@linux# ll
insgesamt 17
drwxr-xr-x 2 root root 168 2006-04-30 12:29 .
drwx------ 12 root root 600 2006-04-30 11:54 ..
-rw-r--r-- 1 root root 1212 2006-04-30 12:08 cacert.pem
-rw------- 1 root root 963 2006-04-30 12:08 cakey.pem
-rw-r--r-- 1 root root 1017 2006-04-30 12:29 req.pem
-rw-r--r-- 1 root root 1679 2006-04-30 12:21 serverkey.pem
5. Personalizzare la configurazione di OpenSSL
Purtroppo OpenSSL non consente di passare tutti i dati come argomenti della riga di comando. È necessario modificare alcune impostazioni nel file /etc/ssl/openssl.cnf
prima di poter firmare. Aprire questo file e modificare le seguenti righe nella sezione [ CA_default ]
:
/etc/ssl/openssl.cnf:dir = . # Where everything is kept
new_certs_dir = $dir # default place for new certs
private_key = $dir/cakey.pem # The private key
RANDFILE = $dir/.rand # private random number file
default_days = 3650 # how long to certify for
Il campo default_days
è preimpostato a 365 giorni e definisce la validità del certificato. Anche i certificati scaduti sono un problema molto comune. Una volta superata la scadenza, nessuno riconosce più il certificato. Per questo motivo è possibile aumentare la durata a 10 anni, ad esempio, come mostrato nell'esempio.
Se non è stato specificato uno stato nel certificato del server, è necessario apportare la seguente modifica in [ policy_match ]
:
stateOrProvinceName = optional
Ora è necessario creare alcuni file:
root@linux# echo 01 > serial
root@linux# touch index.txt
6. Firmare il certificato del server
Arriviamo alla conclusione cerimoniale: la nostra CA firma ora il certificato:
root@linux# openssl ca -in req.pem -notext -out servercert.pem
Enter pass phrase for ./cakey.pem: wrzlprmpft
...
Certificate is to be certified until Apr 27 10:45:36 2016 GMT (3650 days)
Sign the certificate? [y/n]: y
1 out of 1 certificate requests certified, commit? [y/n] y
Write out database with 1 new entries
Data Base Updated
7. Installare il certificato
Il punto di installazione dei certificati dipende dal servizio del server. Hanno tutti in comune: sono necessari solo i file cacert.pem, servercert.pem
e serverkey.pem
. Il file cakey.pem
non è necessario. È meglio non memorizzarlo sul server, ma in un luogo sicuro su un altro computer.