smtp.gmail.com von bash gibt "Fehler im Zertifikat: Der Aussteller des Peer-Zertifikats wird nicht erkannt."

11

Ich brauchte mein Skript, um dem Administrator eine E-Mail zu senden, wenn ein Problem auftritt, und das Unternehmen verwendet nur Google Mail. Nach ein paar Anweisungen konnte ich mailx mithilfe einer .mailrc-Datei einrichten. Es gab zuerst den Fehler von nss-config-dir, den ich durch Kopieren einiger .db-Dateien aus einem Firefox-Verzeichnis behoben habe. zu ./certs und darauf zielen in mailrc. Eine Mail wurde gesendet.

Der obige Fehler trat jedoch auf. Wie durch ein Wunder gab es ein Google-Zertifikat in der .db. Es zeigte sich mit diesem Befehl:

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

Höchstwahrscheinlich kann es ignoriert werden, da die Mail trotzdem funktioniert hat. Nachdem ich ein paar Haare und viele Brillen gezogen hatte, fand ich schließlich heraus, wie ich mich von dem Ärger befreien konnte.

Exportieren Sie zunächst das vorhandene Zertifikat in eine ASSCII-Datei:

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

Importieren Sie diese Datei nun erneut und markieren Sie sie als vertrauenswürdig für SSL-Zertifikate.

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

Danach zeigt die Auflistung, dass es vertrauenswürdig ist:

~]$ certutil -L -d certs

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

Und mailx verschickt ohne Probleme.

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

Ich hoffe, es ist hilfreich für jemanden, der mit dem Fehler fertig werden möchte.

Ich bin auch neugierig auf etwas.

Wie könnte ich dieses Zertifikat erhalten, wenn es nicht zufällig in der Mozilla-Datenbank wäre? Gibt es zum Beispiel so etwas?

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

Antworten:

13

Nun, es ist nicht der einzige Liner, den ich wollte, aber so holen und importieren Sie ein Zertifikat von Grund auf neu:

# 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! und danke an die Antwort auf dieses Ticket

ndasusers
quelle
1
Ich erhalte erneut die Fehlermeldung "Fehler im Zertifikat: Der Aussteller des Peer-Zertifikats wird nicht erkannt." Das von mir aufgenommene Google Mail-Zertifikat ist abgelaufen. Es sieht so aus, als wäre das neue Zertifikat ein verkettetes Zertifikat. openssl s_client -showcerts -connect smtp.gmail.com:465 </dev/nullum sie alle zu sehen.
Spazm
1
Die Antwort wurde mit einem Schritt zum Herunterladen der Emittenten-Cer-Datei aktualisiert.
ndasusers
Dank dieser Karte
ndasusers
7

Dieser Beitrag muss erneut aktualisiert werden. Ich hatte Probleme mit meiner Mailx-Installation auf meiner CentOS 7-Box. Die E-Mail wurde gesendet, aber ich erhielt immer noch den Fehler "Fehler bei der Zertifizierung: Der Aussteller des Peer-Zertifikats wird nicht erkannt." Error.

Ich habe die Lösung hier gefunden , musste sie aber übersetzen.

Hier ist ein schneller Weg, dies zu tun:

# 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

Kopieren Sie nun jedes Zertifikat einschließlich des --BEGIN CERTIFICATE-- und --END CERTIFICATE-- und fügen Sie sie in die zuvor erstellten Dateien (Google, Geotrust, Equifax) ein. Speichern Sie nun diese Dateien.

# 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

Jetzt müssen wir jedes dieser Zertifikate in die Datenbank importieren.

# 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

Beispielausgabe:

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

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

Reinigungszeit (optional)

# 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

Das sollte es sein, Sie sollten nicht den "Fehler in zertifiziert: Peer's Zertifikataussteller wird nicht erkannt" erhalten. Fehler nicht mehr!

Anmerkungen:

Sie haben vielleicht bemerkt, dass ich das Verzeichnis von /certsauf geändert habe ~/.certs. mailx läuft als root, also habe ich diese Änderungen nur als root / vorgenommen. "~ /" bedeutet, dass das HOME-Verzeichnis alles zusammen ~/.certsbedeutet /root/.certs/. Ich bin mir sicher, dass Sie das gewusst haben, aber hey, nur für den Fall, dass Sie nie wissen, wer das lesen könnte!

Für den Fall, dass Sie dies benötigen, finden Sie hier die Konfigurationsoptionen, die ich unten hinzugefügt habe /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

Stellen Sie sicher, dass Sie your.from.user, your.smtp.user und your.pass in die entsprechenden Variablen ändern.

opterons
quelle
Dank opterons funktionierte dies wie Charme, ich weiß nicht, warum @ndasusers nicht funktioniert hat.
Abhishek Madhani
Weiß jemand, wie man das Problem löst, wenn die E-Mail-Server einen Lastenausgleich haben und als Cluster ausgeführt werden? zB Office 365 Das Zertifikat erhält zeitweise eine Fehlermeldung, da der Server am Ende der Verbindung von Verbindung zu Verbindung wechselt.
Brad
Dies ist wieder veraltet: -showcertsgibt zwei Zertifikate, nicht 3. Das zweite ist ein GlobalSign-Zertifikat. Dieses Verfahren ist jedoch das einzige, das funktioniert. Verwenden Sie also +1: Verwenden -showcertsSie alle darin enthaltenen Zertifikate (derzeit 2) und importieren Sie sie einzeln in die Datenbank.
EML
... und laufen opensslwie echo -n | openssl, ot es hängt und wartet auf Eingabe
EML
@ EML + oder openssl s_client </dev/null. Ja, ab 2017 hat Google (einschließlich Google Mail) unter GeoTrust / Equifax von GIA2 unter GlobalSign auf GIA3 umgestellt. Es ist jedoch nicht erforderlich, alle Zertifikate der Kette aufzubewahren. Und wenn ein Krimineller oder Betrüger (wie eine neugierige Regierung) sich als Google Mail ausgibt, vertraut diese Methode ihnen nicht nur, sondern dauerhaft - andere Benutzer werden möglicherweise vorübergehend von einem rechtswidrig ausgestellten Zertifikat getäuscht, aber wenn es widerrufen wird, hören sie auf, ihm zu vertrauen Methode geben Sie weiterhin alle Ihre E-Mails an Übeltäter.
Dave_thompson_085
0

Ich habe basierend auf den Antworten in diesem Thread ein kleines Skript erstellt, das die aktuellen Google Mail-SMTP-Zertifikate automatisch abruft, analysiert und installiert. Es sollte in der Lage sein, damit umzugehen, wenn sich die Anzahl der Zertifikate erneut ändert.

Hier ist auch ein Pastebin mit Syntaxhervorhebung

#!/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
quelle
Wie oben ist dies das Falsche, aber wenn Sie es tun möchten, ist eine Zeile awk ausreichend: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, ich habe Ihren Kommentar nicht gesehen, bevor ich dieses Skript erstellt habe. Vielen Dank! Bearbeiten: Nachdem ich Ihren Einzeiler erneut gelesen habe, sehe ich keinen praktischen Unterschied zwischen meinem Skript und diesem. Ich gehe davon aus, dass Sie mir gerade die einzeilige Version meines Skripts gegeben haben. Gibt es einen empfohlenen "richtigen Weg", um das Problem des dauerhaften Vertrauens nicht zu lösen?
Pyr0ball