smtp.gmail.com de bash da "Error en el certificado: no se reconoce el emisor del certificado de igual".


11

Necesitaba mi script para enviar un correo electrónico al administrador si hubiera un problema, y ​​la compañía solo usa Gmail. Siguiendo algunas instrucciones de publicaciones pude configurar mailx usando un archivo .mailrc. Primero estaba el error de nss-config-dir. Lo resolví copiando algunos archivos .db de un directorio de Firefox. a ./certs y apuntando a ello en mailrc. Un correo fue enviado.

Sin embargo, el error anterior apareció. Por algún milagro, había un certificado de Google en el .db. Apareció con este 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                                    ,,

Lo más probable es que se pueda ignorar, porque el correo funcionó de todos modos. Finalmente, después de tirar un poco de pelo y muchas gafas, descubrí cómo deshacerme de la molestia.

Primero, exporte el certificado existente a un archivo ASSCII:

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

Ahora vuelva a importar ese archivo y márquelo como confiable para los certificados SSL, ala:

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

Después de esto, el listado muestra que es confiable:

~]$ certutil -L -d certs

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

Y mailx envía sin problemas.

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

Espero que sea útil para alguien que quiera terminar con el error.

Además, tengo curiosidad por algo.

¿Cómo podría obtener este certificado, si no estuviera en la base de datos de Mozilla por casualidad? ¿Hay, por ejemplo, algo como esto?

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

Respuestas:


13

Bueno, no es el único revestimiento que quería, pero así es como obtener e importar un certificado desde cero:

# 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! y gracias a la respuesta en este boleto


1
Recibo un error nuevamente, "Error en el certificado: el emisor del certificado de igual no es reconocido" El certificado de Gmail que había ingerido había expirado, parece que el nuevo es un certificado encadenado. openssl s_client -showcerts -connect smtp.gmail.com:465 </dev/nullpara verlos a todos.
spazm

1
Se actualizó la respuesta con un paso para descargar el archivo cer del emisor.
ndasusers

Gracias a este boleto
ndasusers

7

Esta publicación debe actualizarse nuevamente. Estaba teniendo problemas con mi instalación de mailx en mi caja CentOS 7. El correo se enviaba pero aún recibía el mensaje "Error en la certificación: el emisor del certificado de igual no es reconocido". error.

Encontré la solución aquí , aunque tuve que traducirla.

Aquí hay una forma rápida de hacerlo:

# 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

Ahora copie cada certificado, incluido el - COMENZAR CERTIFICADO - y - ENVIAR CERTIFICADO - y péguelos en sus respectivos archivos que creó anteriormente (google, geotrust, equifax) y ahora guarde esos archivos.

# 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

Ahora tenemos que importar cada uno de estos certificados a la base de datos.

# 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

Salida de ejemplo:

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

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

Tiempo de limpieza (opcional)

# 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

Eso debería ser, no debería recibir el "Error en la certificación: el emisor del certificado de igual no es reconocido". error más!

Notas:

Es posible que hayas notado que cambié el directorio de /certsa ~/.certs. mailx se ejecuta como root, así que acabo de hacer estos cambios como root /. "~ /" significa que el directorio HOME lo pone todo junto ~/.certssignifica /root/.certs/. Estoy seguro de que lo sabías, pero ¡oye en caso de que nunca sepas quién podría estar leyendo esto!

En caso de que necesite esto, aquí están las opciones de configuración que agregué al final 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="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

Asegúrese de cambiar your.from.user, your.smtp.user y your.pass a sus respectivas variables.


Gracias opterons esto funcionó a las mil maravillas, no sé por qué @ndasusers no funcionó.
Abhishek Madhani

¿Alguien sabe cómo resolver el problema cuando los servidores de correo electrónico tienen una carga equilibrada y se ejecutan como un clúster? por ejemplo, Office 365 El certificado recibirá un error de forma intermitente porque el servidor al final de la conexión cambia de conexión a conexión.
Brad

Esto está desactualizado nuevamente: -showcertsda dos certificados, no 3. El segundo es GlobalSign. Aún así, este procedimiento es el único que funciona, por lo que +1: usar -showcerts, encontrar todos los certificados en él (actualmente 2) e importarlos individualmente en la base de datos.
EML

... y corre opensslcomo echo -n | openssl, o se cuelga esperando la entrada
EML

@ EML + o openssl s_client </dev/null. Sí, a partir de 2017 Google (incluido gmail) cambió de GIA2 en GeoTrust / Equifax a GIA3 en GlobalSign. Pero no es necesario almacenar todos los certificados de la cadena. Y si algún delincuente o impostor (como un gobierno entrometido) se hace pasar por Gmail, este método no solo confía en ellos, sino que lo hace permanentemente; otros usuarios pueden ser engañados temporalmente por un certificado emitido ilegítimamente, pero cuando se revoca, dejan de confiar en él, mientras que con esto El método continúa dando todo su correo electrónico a los malhechores.
dave_thompson_085

0

Creé un pequeño script, basado en las respuestas en este hilo, que automáticamente extraerá, analizará e instalará los certificados actuales de gmail smtp. Debería poder manejarlo si el número de certs cambia nuevamente.

Aquí hay un pastebin con resaltado de sintaxis también

#!/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

Como se 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")}'
indicó

Ah, no vi tu comentario antes de construir ese guión. ¡Gracias! Editar: después de volver a leer su línea, no veo ninguna diferencia práctica entre mi guión y ese. Supongo que me has dado básicamente la versión de una línea de mi guión. ¿Existe una "forma correcta" recomendada para hacer esto que no tenga el problema de la confianza permanente?
pyr0ball
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.