mailx, gmail e certificati – Gabriele Merli

Spesso mi capita di dover usare mailx da riga di comando per inviare semplici mail di notifica, generalmente all’interno di uno script.

Il pacchetto mailx è questo (in centos 7)

 

Utilizzando un mail server tipo postfix dall’interno di una rete in cui permetto il relay, per mandare un mail basta il comando:

Il soggetto sarà “Subject”, il server di posta utilizzato sarà mailserver.dominio.it, il mail del mittente è me@server con nome Gabriele Merli e il destinatario sarà destination.mail@dominio.it

Poi scrivo il testo, termino con un . e la mail viene inviata.

All’interno di uno script con body precompilato basta una cosa del tipo

ed il testo del messaggio sarà “ciao”.


Volendo usare GMAIL per inviare la stessa semplicissima mail la questione si complica leggermente.

Il comando da dare è questo:

I parametri in più servono per effettuare l’autenticazione in fase di invio via smtp e per connettersi al server via ssl.

Questa la man page di mailx riguardo ai parametri sopra indicati

Nel mio caso ignoro gli errori di validazione del certificato ssl/tls (vedremo poi in seguito)

L’autenticazione avviene tramite AUTH LOGIN passando poi username (generalmente l’indirizzo email @ gmail.com) e la password

La directory dove andiamo a memorizzare i certificati (vedremo poi in seguito), nel mio caso ~/certs

Volendo mandare mail utilizzando starttls e la porta 587 (quindi  primo collegamento in chiaro e poi si effettua la cifratura), il comando da dare è molto simile a quello visto precedentemente

In più abbiamo messo l’opzione

che da il comando STARTTLS.

Ho cambiato la porta di comunicazione(587) e il protocollo (da smtps a  smtp)

Se non si specifica una directory in cui sono contenuti i certificati/chiavi nel formato nss (-S nss-config-dir=~/certs/) l’errore sarà

e l’email non verrà mandata.


Vediamo ora come crearsi una directory con i certificati che servono per inviare le mail con gmail.

Vado a utilizzare  il tool “certutil”

La configurazione di base che possiamo fare è estremamente semplice. Basta infatti creare una directory (nel mio caso ~/certs)

e poi lanciare certutil per creare all’interno della directory i  database con i certificati e le chiavi (non mettendo password)

-N nuova
-d il nome della directory in cui creare il db

All’interno di certs poi mi troverò 3 file .db (certX.db, keyX.db e secmod.db) che conterranno i vari certificati/chiavi che posso importare.

Visto che, quando mandiamo la mail via gmail e mailx, specifichiamo il parametro

-S ssl-verify=ignore

che di fatto ignora ogni possibile verifica del certificato, questo è tutto quello che dobbiamo fare.

In fase di invio ci sarà un warning di questo tipo

ma la mail verrà comunque inviata. Chiaramente se avessi scritto -S ssl-verify=strict questo sarebbe stato un errore che avrebbe fermato la procedura.

Se si vuole evitare di crearsi una cartella (certs) con all’interno i vari database sostanzialmente vuoti, è possibile riciclare quella che già esiste sul sistema se si sta usando firefox.
All’interno della cartella

~/.mozilla/firefox/XXXprofile_numberXXXX.default/

ci sono gli stessi identici 3 file di cui sopra (certX.db, keyX.db e secmod.db) che già contengono tutti i certificati dei server che abbiamo accettato durante la navigazione in internet con firefox.

Basterà quindi specificare in mailx il parametro

-S nss-config-dir=~/.mozilla/firefox/XXXprofile_numberXXXX.default/

(dove XXXprofile_numberXXXX è il nome della cartella contenente il nostro profilo).

Nota che mi sembra di aver capito che i certificati delle CA sono hard-coded all’interno dell’eseguibile di firefox e i certificati che vengno aggiunti in questi file .db sono solo quelli accettati dall’utente.


Ora la parte interessante.  Come posso far sparire il warning
“Error in certificate: Peer’s certificate issuer is not recognized.” e potenzialmente effetture la verifica “strict” del certificato di gmail?

Presumo di aver già creato la directory certs nella home e di aver dato il comando di certutil per creare i 3 file di database (sostanzialmente vuoti) al suo interno.

Ora con il client openssl vado a interrogare smtp.gmail.com per vedere che certificati vengono utilizzati

Tra le rige  —–BEGIN CERTIFICATE—– e —–END CERTIFICATE—– mi trovò il certificato del server. Questo è firmato (Issuer) da “Google Internet Authority” il quale è firmato da “GeoTrust Global” il quale è firmato dalla root CA “Equifax Secure Certificate Authority”. Questi 3 certificati formano la chain che permette al client (conoscendo la CA) di essere sicuro di star parlando proprio con gmail.

Dando lo stesso comando di cui sopra, ma specificando anche -showcerts potrò vedere tutti e 3 i certificati della chain

Ora prendo ciascuna riga compresa tra —–BEGIN CERTIFICATE—– e —–END CERTIFICATE—– (comprese) e creo 3 file (chiamti come voglio, nel mio caso google, geotrust e equifax) contenenti i 3 certificati.

Vado ora ad aggiungere al mio db i 3 certificati appena salvati

-A aggiunge
-n è il nickname del certificato che gli asssegno nel db (nel mio caso ho copiato il CN)
-t è la tipologia di certificato (non ho pienamente compreso cosa sia)

-d certs la directory che contiene i file del database
-i nome_file il nome del file contenente il certificato

Verifico di aver importato correttamente i 3 certificati dando il comando

per curiosità lo stesso comando lo puoi dare sulla directory di mozilla e verificare che i certificati che vedi sono gli stessi che trovi nelle Preferences/Advanced/Certificates/View Certificates/Servers

Ora quindi nel mio db ho i 3 certificati della chain di gmail. Riprovo a dare il comando di mailx per inviare le mail e, effettivamente, il warning “Error in certificate: Peer’s certificate issuer is not recognized.” è sparito.

Purtroppo però ciò non vuol dire che io possa mettere “-S ssl-verify=strict” in quanto, se lo faccio, la procedura si blocca comunque dando il messaggio:
Comparing DNS name: “smtp.gmail.com”.

Peraltro sto usando i certificati in modo improprio, prendendo per buoni quelli che mi fornisce gmail e non andando a verificare per davvero quello della CA che avrei dovuto scaricare da altre fonti.

Spesso mi capita di dover usare mailx da riga di comando per inviare semplici mail di notifica, generalmente all’interno di uno script.

Il pacchetto mailx è questo (in centos 7)

 

Utilizzando un mail server tipo postfix dall’interno di una rete in cui permetto il relay, per mandare un mail basta il comando:

Il soggetto sarà “Subject”, il server di posta utilizzato sarà mailserver.dominio.it, il mail del mittente è me@server con nome Gabriele Merli e il destinatario sarà destination.mail@dominio.it

Poi scrivo il testo, termino con un . e la mail viene inviata.

All’interno di uno script con body precompilato basta una cosa del tipo

ed il testo del messaggio sarà “ciao”.


Volendo usare GMAIL per inviare la stessa semplicissima mail la questione si complica leggermente.

Il comando da dare è questo:

I parametri in più servono per effettuare l’autenticazione in fase di invio via smtp e per connettersi al server via ssl.

Questa la man page di mailx riguardo ai parametri sopra indicati

Nel mio caso ignoro gli errori di validazione del certificato ssl/tls (vedremo poi in seguito)

L’autenticazione avviene tramite AUTH LOGIN passando poi username (generalmente l’indirizzo email @ gmail.com) e la password

La directory dove andiamo a memorizzare i certificati (vedremo poi in seguito), nel mio caso ~/certs

Volendo mandare mail utilizzando starttls e la porta 587 (quindi  primo collegamento in chiaro e poi si effettua la cifratura), il comando da dare è molto simile a quello visto precedentemente

In più abbiamo messo l’opzione

che da il comando STARTTLS.

Ho cambiato la porta di comunicazione(587) e il protocollo (da smtps a  smtp)

Se non si specifica una directory in cui sono contenuti i certificati/chiavi nel formato nss (-S nss-config-dir=~/certs/) l’errore sarà

e l’email non verrà mandata.


Vediamo ora come crearsi una directory con i certificati che servono per inviare le mail con gmail.

Vado a utilizzare  il tool “certutil”

La configurazione di base che possiamo fare è estremamente semplice. Basta infatti creare una directory (nel mio caso ~/certs)

e poi lanciare certutil per creare all’interno della directory i  database con i certificati e le chiavi (non mettendo password)

-N nuova
-d il nome della directory in cui creare il db

All’interno di certs poi mi troverò 3 file .db (certX.db, keyX.db e secmod.db) che conterranno i vari certificati/chiavi che posso importare.

Visto che, quando mandiamo la mail via gmail e mailx, specifichiamo il parametro

-S ssl-verify=ignore

che di fatto ignora ogni possibile verifica del certificato, questo è tutto quello che dobbiamo fare.

In fase di invio ci sarà un warning di questo tipo

ma la mail verrà comunque inviata. Chiaramente se avessi scritto -S ssl-verify=strict questo sarebbe stato un errore che avrebbe fermato la procedura.

Se si vuole evitare di crearsi una cartella (certs) con all’interno i vari database sostanzialmente vuoti, è possibile riciclare quella che già esiste sul sistema se si sta usando firefox.
All’interno della cartella

~/.mozilla/firefox/XXXprofile_numberXXXX.default/

ci sono gli stessi identici 3 file di cui sopra (certX.db, keyX.db e secmod.db) che già contengono tutti i certificati dei server che abbiamo accettato durante la navigazione in internet con firefox.

Basterà quindi specificare in mailx il parametro

-S nss-config-dir=~/.mozilla/firefox/XXXprofile_numberXXXX.default/

(dove XXXprofile_numberXXXX è il nome della cartella contenente il nostro profilo).

Nota che mi sembra di aver capito che i certificati delle CA sono hard-coded all’interno dell’eseguibile di firefox e i certificati che vengno aggiunti in questi file .db sono solo quelli accettati dall’utente.


Ora la parte interessante.  Come posso far sparire il warning
“Error in certificate: Peer’s certificate issuer is not recognized.” e potenzialmente effetture la verifica “strict” del certificato di gmail?

Presumo di aver già creato la directory certs nella home e di aver dato il comando di certutil per creare i 3 file di database (sostanzialmente vuoti) al suo interno.

Ora con il client openssl vado a interrogare smtp.gmail.com per vedere che certificati vengono utilizzati

Tra le rige  —–BEGIN CERTIFICATE—– e —–END CERTIFICATE—– mi trovò il certificato del server. Questo è firmato (Issuer) da “Google Internet Authority” il quale è firmato da “GeoTrust Global” il quale è firmato dalla root CA “Equifax Secure Certificate Authority”. Questi 3 certificati formano la chain che permette al client (conoscendo la CA) di essere sicuro di star parlando proprio con gmail.

Dando lo stesso comando di cui sopra, ma specificando anche -showcerts potrò vedere tutti e 3 i certificati della chain

Ora prendo ciascuna riga compresa tra —–BEGIN CERTIFICATE—– e —–END CERTIFICATE—– (comprese) e creo 3 file (chiamti come voglio, nel mio caso google, geotrust e equifax) contenenti i 3 certificati.

Vado ora ad aggiungere al mio db i 3 certificati appena salvati

-A aggiunge
-n è il nickname del certificato che gli asssegno nel db (nel mio caso ho copiato il CN)
-t è la tipologia di certificato (non ho pienamente compreso cosa sia)

-d certs la directory che contiene i file del database
-i nome_file il nome del file contenente il certificato

Verifico di aver importato correttamente i 3 certificati dando il comando

per curiosità lo stesso comando lo puoi dare sulla directory di mozilla e verificare che i certificati che vedi sono gli stessi che trovi nelle Preferences/Advanced/Certificates/View Certificates/Servers

Ora quindi nel mio db ho i 3 certificati della chain di gmail. Riprovo a dare il comando di mailx per inviare le mail e, effettivamente, il warning “Error in certificate: Peer’s certificate issuer is not recognized.” è sparito.

Purtroppo però ciò non vuol dire che io possa mettere “-S ssl-verify=strict” in quanto, se lo faccio, la procedura si blocca comunque dando il messaggio:
Comparing DNS name: “smtp.gmail.com”.

Peraltro sto usando i certificati in modo improprio, prendendo per buoni quelli che mi fornisce gmail e non andando a verificare per davvero quello della CA che avrei dovuto scaricare da altre fonti.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.