Progetto

Generale

Profilo

Verificare chiavi e certificati nelle configurazioni di SSL/TLS

Quando si lavoro con file .pem nella gestione di certificati SSL, specie se si cambiano i certificati su un server, può capitare di confondere i file, e non essere più sicuri di aver associato correttamente un certificato alla sua chiave. La modalità più immediata per verificare che il file server-cert.pem sia effettivamente un certificato associato alla chiave del file server-key.pem è quella di usare il comando s_server della suite di openssl, in pratica basta eseguire:

openssl s_server -cert server-cert.pem -key server-key.pem 

se l'abbinamento è corretto si otterrà:

Using default temp DH parameters
Using default temp ECDH parameters
ACCEPT

altrimenti si otterrà:

Using default temp DH parameters
Using default temp ECDH parameters
error setting private key
26606:error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch:x509_cmp.c:406:

Si tenga presente che se un certificato è stato firmato da un certificato intermedio l'associazione fra certificato e chiave non è sufficiente, occorre anche vericare la correttezza di tutta la catena di certificazione. Questo si può fare con il comando verify della suite di openssl, percorrendo la catena di certificazione. Il caso più comune è quello in cui esiste un solo passo attraverso un certificato intermedio server-interm.pem fornito dalla propria Certification Authority insieme al certificato firmato server-cert.pem.

In questo caso occorrerà prima verificare la validità del certificato intermedio con:

# openssl verify server-interm.pem 
server-interm.pem: OK

e poi per verificare il certificato finale utilizzando il certificato intemedio con:

# openssl verify -CAfile server-interm.pem server-cert.pem
server-cert.pem: OK

dove appunto con -CAfile si indica di usare server-interm.pem per la verifica e non il default che su Debian è fare riferimento ai certificati delle Certification Authority riconosciute installati sotto /etc/ssl/certs/ (qualora fossero altrove nel primo comando si sarebbe dovuto specificarlo con l'opzione -CApath).

Una volta stabilita la correttezza e la corrispondenza di tutti i file, si deve tener presente che molti server richiedono che nel file del certificato (quello da indicare ad esempio nelle direttive smtpd_tls_cert_file di Postfix o ssl_cert di Dovecot) venga inserito non il certifiato finale, ma tutta la catena, pertanto ssi dovrà creare un file contenente tutti i certificati della catena di certificazione con:

cat server-cert.pem server-interm.pem > server-chained.pem

ed usare server-chained.pem nelle direttive citate; si tenga presente che l'ordine conta: si deve seguire all'indietro la catena, dal proprio certificato fino a quello della Certification Authority, omettendo quest'ultimo.

Infine una volta configurato il servizio se ne potrà controllare il funzionamento e la correttezza dei certificati installati con il comando s_client di openssl, ad esempio per verificare il funzionamento di Postfix si potrà usare il comando:

# openssl s_client -connect localhost:25 -starttls smtp -CApath /etc/ssl/certs/
CONNECTED(00000003)
[...]
    Compression: 1 (zlib compression)
    Start Time: 1415887713
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
250 DSN

avendo cura di indicare con -starttls il tipo di protocollo usato quando si opera con STARTLS (altri valori possibili sono pop3, imap e ftp); si noti come in questo caso è necessario indicare con -CApath la directory dove sono mantenuti i certificati delle Certification Autority riconosciute.