smtp.gmail.com di bash fornisce "Errore nel certificato: l'emittente del certificato peer non è riconosciuto."


11

Avevo bisogno del mio script per inviare email all'amministratore in caso di problemi e la società utilizza solo Gmail. Seguendo alcune istruzioni sui post sono stato in grado di configurare mailx usando un file .mailrc. c'è stato prima l'errore di nss-config-dir che ho risolto copiando alcuni file .db da una directory di firefox. a ./certs e puntando ad esso in mailrc. È stata inviata una mail.

Tuttavia, l'errore sopra è emerso. Per miracolo, c'era un certificato Google nel .db. Si presentò con questo comando:

~]$ certutil -L -d certs

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

GeoTrust SSL CA                                              ,,
VeriSign Class 3 Secure Server CA - G3                       ,,
Microsoft Internet Authority                                 ,,
VeriSign Class 3 Extended Validation SSL CA                  ,,
Akamai Subordinate CA 3                                      ,,
MSIT Machine Auth CA 2                                       ,,
Google Internet Authority                                    ,,

Molto probabilmente, può essere ignorato, perché la posta ha funzionato comunque. Alla fine, dopo aver tirato i capelli e molti googles, ho scoperto come liberarmi dal fastidio.

Innanzitutto, esporta il certificato esistente in un file ASSCII:

~]$ certutil -L -n 'Google Internet Authority'  -d certs -a > google.cert.asc

Ora reimporta quel file e contrassegnalo come attendibile per i certificati SSL, ala:

~]$ certutil -A -t "C,," -n 'Google Internet Authority'  -d certs -i google.cert.asc

Successivamente, l'elenco mostra che è attendibile:

~]$ certutil -L -d certs

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI
...
Google Internet Authority                                    C,,

E mailx invia senza intoppi.

~]$ /bin/mailx -A gmail -s "Whadda ya no" somebody@acompany.com
ho ho ho
EOT
~]$

Spero che sia utile a qualcuno che cerca di fare l'errore.

Inoltre, sono curioso di sapere qualcosa.

Come potrei ottenere questo certificato, se non fosse nel database di Mozilla per caso? C'è ad esempio qualcosa del genere?

    ~]$ certutil -A -t "C,," \
                 -n 'gmail.com'  \
                 -d certs \
                 -i 'http://google.com/cert/this...'

Risposte:


13

Beh, non è quello che volevo, ma ecco come recuperare e importare un certificato da zero:

# Create a certificate directory
~]$ mkdir certs

# Create a new database in the certs dir
~]$ certutil -N -d certs 

# Need now a chain certificate - May 18, 2015
~]$ wget https://www.geotrust.com/resources/root_certificates/certificates/GeoTrust_Global_CA.cer

# Need now a chain certificate part 2 - May 18, 2015
~]$ mv GeoTrust_Global_CA.cer certs/

# Fetch the certificate from Gmail, saving in the text file GMAILCERT
# Added the CA opion - May 18, 2015
~]$ echo -n | openssl s_client -connect smtp.gmail.com:465 -CAfile certs/GeoTrust_Global_CA.cer | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > GMAILCERT

# Import the new cert file into the new database in the new dir
~]$ certutil -A -n "Google Internet Authority" -t "C,," -d certs -i GMAILCERT 

# Double Check
~]$ certutil -L -d certs

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

Google Internet Authority                                    C,,  

Yaa! e grazie alla risposta su questo biglietto


1
Ricevo un errore "Errore nel certificato: l'emittente del certificato del peer non viene riconosciuto". Il certificato gmail che avevo ingerito era scaduto, sembra che quello nuovo sia un certificato incatenato. openssl s_client -showcerts -connect smtp.gmail.com:465 </dev/nullper vederli tutti.
spazm,

1
Aggiornata la risposta con un passaggio per scaricare il file cer degli emittenti.
ndasusers


7

Questo post deve essere aggiornato di nuovo. Ho avuto problemi con l'installazione di mailx sul mio CentOS 7 box. La posta veniva inviata ma continuavo a ricevere il messaggio "Errore nella certificazione: l'emittente del certificato peer non viene riconosciuto". errore.

Ho trovato la soluzione qui , ho dovuto tradurla però.

Ecco un modo rapido per farlo:

# Create a certificate directory
mkdir ~/.certs

# Create a new database in the certs dir (dont forget to enter your pass phrase!)
certutil -N -d ~/.certs 

# Create three files for the cert chain
touch ~/.certs/google ~/.certs/geotrust ~/.certs/equifax

# Copy the cert chain for smtp.google.com:465 over to my_certs file (don't forget the -showcerts option, CTRL + C to end this command)
openssl s_client -showcerts -connect smtp.gmail.com:465 > ~/.certs/my_certs

Ora copia ogni certificato incluso il --BEGIN CERTIFICATE-- e --END CERTIFICATE-- e incollali nei rispettivi file che hai creato in precedenza (google, geotrust, equifax) e ora salva quei file.

# Open your my_certs file you made earlier and copy the google cert (usually the first one)
nano ~/.certs/my_certs

# Open your google file, paste the google cert that you just copied, and save and close
nano ~/.certs/google

# Open your my_certs file you made earlier and copy the geotrust cert (usually the second one)
nano ~/.certs/my_certs

# Open your geotrust file, paste the geotrust cert that you just copied, and save and close
nano ~/.certs/geotrust

# Open your my_certs file you made earlier and copy the equifax cert (usually the third one)
nano ~/.certs/my_certs

# Open your equifax file, paste the equifax cert that you just copied, and save and close
nano ~/.certs/equifax

Ora dobbiamo importare ciascuno di questi certificati nel db.

# Import the google cert into the db
certutil -A -n "Google Internet Authority" -t "TC,," -d ~/.certs -i ~/.certs/google

# Import the geotrust cert into the db
certutil -A -n "GeoTrust Global CA" -t "TC,," -d ~/.certs -i ~/.certs/geotrust

# Import the equifax cert into the db
certutil -A -n "Equifax Secure Certificate Authority" -t "TCP,," -d ~/.certs -i ~/.certs/equifax

# Double check to make sure everything imported correctly into the db
certutil -L -d ~/.certs

Esempio di output:

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

Google Internet Authority                                    CT,,
GeoTrust Global CA                                           CT,,
Equifax Secure Certificate Authority                         CT,,

Tempo di pulizia (opzionale)

# Remove all unnecessary files since the db has the certs :)
rm -rf ~/.certs/google ~/.certs/geotrust ~/.certs/equifax ~/.certs/my_certs

# Now run a test to make sure mailx is sending correctly now (don't forget to change yourname@example.com to the email address you'd like to send to)
echo "Your message" | mail -s "Message Subject" yourname@example.com

Dovrebbe essere così, non dovresti ricevere "Errore nella certificazione: l'emittente di certificati peer non è riconosciuto." errore più!

Appunti:

Potresti aver notato che ho cambiato la directory da /certsa ~/.certs. mailx funziona come root, quindi ho appena fatto queste modifiche come root /. "~ /" Significa directory HOME mettere tutto insieme ~/.certsmezzi /root/.certs/. Sono sicuro che lo sapevi, ma hey nel caso in cui non sai mai chi potrebbe leggerlo!

Nel caso in cui ne abbiate bisogno, ecco le opzioni di configurazione che ho aggiunto in fondo /etc/mail.rc

# /etc/mail.rc options added to the bottom
set smtp-use-starttls
set smtp-auth=login
set smtp=smtp://smtp.gmail.com:587
set from="your.from.user@gmail.com(Web01 Server)"
set smtp-auth-user=your.smtp.user@gmail.com
set smtp-auth-password=your.pass
set ssl-verify=ignore
set nss-config-dir=/root/.certs

Assicurati di modificare your.from.user, your.smtp.user e your.pass nelle rispettive variabili.


Grazie a Opterons questo ha funzionato come un fascino, non so perché @ndasusers non ha funzionato.
Abhishek Madhani,

Qualcuno sa come risolvere il problema quando i server di posta elettronica sono bilanciati in base al carico ed eseguiti come cluster? ad es. Office 365 Il certificato riceverà un errore in modo intermittente poiché il server al termine della connessione passa da una connessione all'altra.
Brad,

Questo non è più aggiornato: -showcertsfornisce due certificati, non 3. Il secondo è GlobalSign. Tuttavia, questa procedura è l'unica che funziona, quindi +1: usa -showcerts, trova tutti i certificati (attualmente 2) e li importa singolarmente nel database.
EML

... e corri opensslcome echo -n | openssl, altrimenti è in attesa di input
EML

@ EML + o openssl s_client </dev/null. Sì, a partire dal 2017 Google (incluso gmail) è passato da GIA2 in GeoTrust / Equifax a GIA3 in GlobalSign. Ma non è necessario conservare tutti i certificati della catena. E se un criminale o un impostore (come un governo ficcanaso) impersona Gmail, questo metodo non solo si fida di loro ma lo fa in modo permanente - altri utenti potrebbero essere temporaneamente ingannati da un certificato rilasciato illegittimamente ma quando viene revocato smettono di fidarsi di ciò mentre con questo metodo continui a dare tutta la tua email ai malfattori.
dave_thompson_085,

0

Ho creato un piccolo script, basato sulle risposte in questo thread, che estrarrà, analizzerà e installerà automaticamente gli attuali smtp certs di gmail. Dovrebbe essere in grado di gestirlo se il numero di certificati cambia di nuovo.

Ecco un pastebin con l'evidenziazione della sintassi

#!/bin/bash

# This script pulls ssl certs for using gmail smtp. Adapted from the following config explaination:
# /server/498588/smtp-gmail-com-from-bash-gives-error-in-certificate-peers-certificate-issuer

certdirectory="/home/user/.certs"

# Functions

fail() {
    ec=$?
    [ "${ec}" == "0" ] && ec=1
    echo -e "FAILED[code=$ec]: $@"
    exit $ec
}

warn(){
echo -e "WARNING $@"
}

cleanup() {
  rm allgcert* || warn "Cleanup of files errored"
  rm gcert* || warn "Cleanup of files errored"
}

failclean() {
  cleanup
  fail "$@"
}

# Count number of certs currently being used (can change from time to time)
numcerts=$(echo -n | openssl s_client -showcerts -connect smtp.gmail.com:465 | grep -c "i:")

# Create the certs directory if it does not exist
mkdir -p $certdirectory || fail "Unable to create certificates directory"

# Pull certs to a local file for parsing
echo -n | openssl s_client -showcerts -connect smtp.gmail.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > allgcert || failclean "Unable to pull certs from smtp.gmail.com"

# Parses certs output based on the number of certs, and outputs to individual files
if (($numcerts > 1)) ; then
  # Pulls the first cert out as it needs one extra line
  sed '1,27!d' allgcert > gcert1
  # For subsequent certs, it multiplies the cert number by the number of lines in the file where it should exist
  for i in $(seq 2 $numcerts) ; do
    sed "$((2 + (((($i - 1)) * 26))))"','"$((1 + (($i * 26))))"'!d' allgcert > gcert${i}
  done
fi

# Parses out certificate issuer names for installation
echo -n | openssl s_client -showcerts -connect smtp.gmail.com:465 | grep i: | sed -e 's,.*=,,' > allgcertnames || failclean "Unable to output parsed names for certificates"

for i in $(seq 1 $numcerts) ; do
  certutil -A -n "$(sed -n ${i}p allgcertnames)" -t "TC,," -d $certdirectory -i gcert${i} || failclean "Unable to import certificates to database"
done

cleanup

Come sopra questa è la cosa sbagliata da fare, ma se vuoi farlo è sufficiente una riga di awk:openssl s_client </dev/null -showcerts -connect ... | awk '/^ i:/{n=substr($0,7)} /-BEGIN/,/-END/{print>"t"} /-END/{close("t"); system("certutil -A -n \"" n "\" -t TC,, -i t -d certdir || echo failed; rm t")}'
dave_thompson_085

Ah, non ho visto il tuo commento prima di creare quella sceneggiatura. Grazie! Modifica: dopo aver riletto il tuo one-liner, non vedo alcuna differenza pratica tra la mia sceneggiatura e quella. Suppongo che tu mi abbia appena dato sostanzialmente la versione one-liner della mia sceneggiatura. Esiste un "modo giusto" raccomandato per farlo che non avrà il problema della fiducia permanente?
pyr0ball,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.