smtp.gmail.com de bash donne "Erreur dans le certificat: l'émetteur du certificat de l'homologue n'est pas reconnu."

11

J'avais besoin de mon script pour envoyer un e-mail à l'administrateur en cas de problème, et la société utilise uniquement Gmail. Après quelques instructions de publication, j'ai pu configurer mailx à l'aide d'un fichier .mailrc. il y avait d'abord l'erreur de nss-config-dir J'ai résolu cela en copiant certains fichiers .db à partir d'un répertoire firefox. à ./certs et le viser dans mailrc. Un mail a été envoyé.

Cependant, l'erreur ci-dessus s'est produite. Par miracle, il y avait un certificat Google dans le .db. Il est apparu avec cette commande:

~]$ 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                                    ,,

Très probablement, il peut être ignoré, car le courrier a quand même fonctionné. Enfin, après avoir tiré quelques cheveux et de nombreux googles, j'ai découvert comment me débarrasser de la gêne.

Tout d'abord, exportez le certificat existant vers un fichier ASSCII:

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

Maintenant, réimportez ce fichier et marquez-le comme approuvé pour les certificats SSL, ala:

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

Après cela, la liste montre qu'il fait confiance:

~]$ certutil -L -d certs

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

Et mailx envoie sans accroc.

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

J'espère que cela sera utile à quelqu'un qui cherche à en finir avec l'erreur.

Aussi, je suis curieux de savoir quelque chose.

Comment pourrais-je obtenir ce certificat, s'il n'était pas dans la base de données mozilla par hasard? Y a-t-il par exemple quelque chose comme ça?

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

Réponses:

13

Eh bien, ce n'est pas la doublure que je voulais, mais voici comment récupérer et importer un certificat à partir de zéro:

# 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! et merci à la réponse sur ce ticket

ndasusers
la source
1
Je reçois à nouveau une erreur "Erreur dans le certificat: l'émetteur du certificat de l'homologue n'est pas reconnu". Le certificat gmail que j'avais ingéré avait expiré, il semble que le nouveau soit un certificat chaîné. openssl s_client -showcerts -connect smtp.gmail.com:465 </dev/nullpour les voir tous.
spazm
1
Mise à jour de la réponse avec une étape pour télécharger le fichier cer des émetteurs.
ndasusers
Merci à ce billet
ndasusers
7

Ce message doit être mis à jour à nouveau. J'avais des problèmes avec mon installation mailx sur ma box CentOS 7. Le courrier serait envoyé mais je recevais toujours le message d'erreur "Erreur de certification: l'émetteur du certificat de l'homologue n'est pas reconnu". Erreur.

J'ai trouvé la solution ici , mais je devais la traduire.

Voici un moyen rapide de le faire:

# 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

Copiez maintenant chaque certificat, y compris les certificats --BEGIN CERTIFICATE-- et --END CERTIFICATE-- et collez-les dans leurs fichiers respectifs que vous avez créés précédemment (google, geotrust, equifax) et enregistrez maintenant ces fichiers.

# 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

Maintenant, nous devons importer chacun de ces certificats dans la base de données.

# 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

Exemple de sortie:

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

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

Temps de nettoyage (facultatif)

# 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 [email protected] to the email address you'd like to send to)
echo "Your message" | mail -s "Message Subject" yourname@example.com

Cela devrait être ça, vous ne devriez pas recevoir le "Erreur de certification: l'émetteur du certificat de l'homologue n'est pas reconnu." erreur plus!

Remarques:

Vous avez peut-être remarqué que j'ai changé le dir de /certsen ~/.certs. mailx s'exécute en tant que root, donc je viens de faire ces changements en tant que root /. "~ /" signifie que le répertoire HOME met tous les ~/.certsmoyens ensemble /root/.certs/. Je suis sûr que vous le saviez, mais au cas où vous ne savez jamais qui pourrait lire ceci!

Juste au cas où vous en auriez besoin, voici les options de configuration que j'ai ajoutées au bas de /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="[email protected](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

Assurez-vous de changer votre.from.user, votre.smtp.user et votre.pass à leurs variables respectives.

opterons
la source
Merci opterons cela a fonctionné comme un charme, je ne sais pas pourquoi @ndasusers n'a pas fonctionné.
Abhishek Madhani
Quelqu'un sait comment résoudre le problème lorsque les serveurs de messagerie sont équilibrés en charge et exécutés en cluster? par exemple Office 365 Le certificat obtiendra par intermittence une erreur car le serveur à la fin de la connexion change de connexion en connexion.
Brad
Ceci est à nouveau obsolète: -showcertsdonne deux certificats, pas 3. Le second est un GlobalSign. Néanmoins, cette procédure est la seule qui fonctionne, alors +1: utilisez -showcerts, recherchez tous les certificats (actuellement 2) et importez-les individuellement dans la base de données.
EML
... et fonctionner opensslcomme echo -n | openssl, ou il se bloque en attendant l'entrée
EML
@ EML + ou openssl s_client </dev/null. Oui, depuis 2017, Google (y compris gmail) est passé de GIA2 sous GeoTrust / Equifax à GIA3 sous GlobalSign. Mais il n'est pas nécessaire de stocker tous les certificats de la chaîne. Et si un criminel ou un imposteur (comme un gouvernement fouineur) usurpe l'identité de Gmail, cette méthode non seulement leur fait confiance mais le fait de manière permanente - d'autres utilisateurs peuvent être temporairement trompés par un certificat délivré de manière illégitime, mais lorsqu'il est révoqué, ils cessent de lui faire confiance alors qu'avec cela vous continuez de donner tous vos e-mails aux malfaiteurs.
dave_thompson_085
0

J'ai créé un petit script, basé sur les réponses de ce fil, qui va automatiquement extraire, analyser et installer les certificats smtp gmail actuels. Il devrait pouvoir le gérer si le nombre de certificats change à nouveau.

Voici une boîte à pâte avec mise en évidence de la syntaxe également

#!/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
pyr0ball
la source
Comme ci-dessus, ce n'est pas la bonne chose à faire, mais si vous voulez le faire, une ligne de awk suffit: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 je n'ai pas vu votre commentaire avant de construire ce script. Merci! Edit: après avoir relu votre one-liner, je ne vois aucune différence pratique entre mon script et celui-là. Je suppose que vous venez de me donner essentiellement la version à une ligne de mon script. Existe-t-il une «bonne façon» recommandée de faire cela qui n'aura pas le problème de la confiance permanente?
pyr0ball