%20empfangen%2C%20von%20anderen%20aber%20ok.%20Warum%3F.png)
Ich musste mir gerade einen CentOS 6-Server mit Postfix 2.6.6 ansehen, der zwar in der Lage war, an alle E-Mails zu senden, aber aufgrund eingehender TLS-Aushandlungsprobleme keine von GMail (und einigen anderen MTAs) empfangen konnte.
Eine Verbindung von einem .google.com
SMTP-Server (z. B. GMail) führte zu Folgendem:
Aug 23 19:34:29 server1 postfix/smtpd[7659]: connect from mail-lf1-f44.google.com[209.85.167.44]
Aug 23 19:34:29 server1 postfix/smtpd[7659]: setting up TLS connection from mail-lf1-f44.google.com[209.85.167.44]
Aug 23 19:34:29 server1 postfix/smtpd[7659]: SSL_accept error from mail-lf1-f44.google.com[209.85.167.44]: -1
Aug 23 19:34:29 server1 postfix/smtpd[7659]: warning: TLS library problem: 7659:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1387:
Aug 23 19:34:29 server1 postfix/smtpd[7659]: lost connection after STARTTLS from mail-lf1-f44.google.com[209.85.167.44]
Aug 23 19:34:29 server1 postfix/smtpd[7659]: disconnect from mail-lf1-f44.google.com[209.85.167.44]
Erhöhen der Ausführlichkeit der TLS-Protokollierung:
Aug 23 21:56:15 server1 postfix/smtpd[18103]: initializing the server-side TLS engine
Aug 23 21:56:15 server1 postfix/smtpd[18103]: connect from mail-lf1-f47.google.com[209.85.167.47]
Aug 23 21:56:15 server1 postfix/smtpd[18103]: setting up TLS connection from mail-lf1-f47.google.com[209.85.167.47]
Aug 23 21:56:15 server1 postfix/smtpd[18103]: mail-lf1-f47.google.com[209.85.167.47]: TLS cipher list "ALL:+RC4:@STRENGTH:!aNULL:!LOW:!EXP:!MEDIUM:!ADH:!AECDH:!MD5:!DSS:!ECDSA:!CAMELLIA128:!3DES:!CAMELLIA256:!RSA+AES:!eNULL"
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL_accept:before/accept initialization
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL3 alert write:fatal:handshake failure
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL_accept:error in SSLv3 read client hello C
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL_accept error from mail-lf1-f47.google.com[209.85.167.47]: -1
Aug 23 21:56:15 server1 postfix/smtpd[18103]: warning: TLS library problem: 18103:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1387:
Aug 23 21:56:15 server1 postfix/smtpd[18103]: lost connection after STARTTLS from mail-lf1-f47.google.com[209.85.167.47]
Aug 23 21:56:15 server1 postfix/smtpd[18103]: disconnect from mail-lf1-f47.google.com[209.85.167.47]
Keine gemeinsame Chiffre?!
TLS war bereits mit einem (wenn auch selbstsignierten) Serverzertifikat aktiviert; Clients stellten erfolgreich eine Verbindung her, um E-Mails über IMAP/POP mit SASL zu senden und zu empfangen.
Ich habe mich über die häufigsten Ursachen des 1408A0C1
Postfix-Fehlers informiert, aber keine davon schien auf dieses Szenario zuzutreffen. Einige der von mir durchgeführten Prüfungen führten zu Ergebnissen, die meinen Erwartungen zu widersprechen schienen.
postconf -d | grep cipherlist
hatte diese ziemlich kurze Liste von Ausschlüssen:
tls_export_cipherlist = ALL:+RC4:@STRENGTH
tls_high_cipherlist = ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH
tls_low_cipherlist = ALL:!EXPORT:+RC4:@STRENGTH
tls_medium_cipherlist = ALL:!EXPORT:!LOW:+RC4:@STRENGTH
tls_null_cipherlist = eNULL:!aNULL
und die TLS-Protokolle waren ziemlich nachsichtig:
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_protocols = !SSLv2, !SSLv3
smtp_tls_protocols = !SSLv2, !SSLv3
Warum war es also nicht möglich, eine Chiffre auszuhandeln?
Ich begann zunächst damit, OpenSSL zu aktualisieren (das war OpenSSL 1.0.1e-fips 11 Feb 2013
die neueste Version, die über verfügbar war yum
). Ichwie in diesem Artikel beschriebenund folglich läuft die Box OpenSSL 1.0.2p 14 Aug 2018
.
Das Problem mit dem GMail-Empfang bestand jedoch weiterhin ...
Ich habe sie so gelassen, um allen möglichen TLS-Varianten eine Chance auf Erfolg zu geben, und habe die Chiffren genauer untersucht.
DeaktivierenalleVon den Verschlüsselungsausschlüssen habe ich eine Test-E-Mail von meinem Gmail-Konto gesendet und wenig überraschend kam sie an:
Aug 23 23:39:52 server1 postfix/smtpd[6036]: connect from mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/smtpd[6036]: setting up TLS connection from mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/smtpd[6036]: mail-lj1-f171.google.com[209.85.208.171]: TLS cipher list "ALL:+RC4:@STRENGTH"
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:before/accept initialization
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 read client hello B
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write server hello A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write certificate A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write server done A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 flush data
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 read client key exchange A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 read finished A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write session ticket A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write change cipher spec A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write finished A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 flush data
Aug 23 23:39:52 server1 postfix/smtpd[6036]: Anonymous TLS connection established from mail-lj1-f171.google.com[209.85.208.171]: TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)
Aug 23 23:39:52 server1 postfix/smtpd[6036]: 66BB15DC6: client=mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/cleanup[6424]: 66BB15DC6: message-id=<CAK9Gk9r+6gt7g_U987A0XaGdKJGY=80n0rK595mqrmfGaL5LKQ@mail.gmail.com>
Aug 23 23:39:52 server1 opendkim[6890]: 66BB15DC6: mail-lj1-f171.google.com [209.85.208.171] not internal
Aug 23 23:39:52 server1 opendkim[6890]: 66BB15DC6: not authenticated
Aug 23 23:39:52 server1 opendkim[6890]: 66BB15DC6: DKIM verification successful
Aug 23 23:39:52 server1 postfix/qmgr[6032]: 66BB15DC6: from=<gmailaddress>, size=3988, nrcpt=1 (queue active)
Aug 23 23:39:52 server1 postfix/smtpd[6036]: disconnect from mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/pipe[6425]: 66BB15DC6: to=<myinbox>, relay=dovecot, delay=0.48, delays=0.29/0.01/0/0.18, dsn=2.0.0, status=sent (delivered via dovecot service)
Wenn GMail also AES128-GCM-SHA256
über TLSv1.2 verhandelt hat – warum hat es vorher nicht funktioniert? Insbesondere, da ihre Chiffrierliste alle möglichen Übereinstimmungen zu enthalten scheint, mit RC4 am Ende, sortiert nach Stärke?
Zum Testen habe ich eine bestimmte Chiffreliste genommen, die AES128-Hashtiefen (kursiv) – ECDHE- und DHE-Methoden – vorangestellt und sie explizit in Postfix deklariert, was funktioniert hat:
tls_high_cipherlist=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
Ich wollte die Cipherlist-Rezepte allerdings nicht ständig aktualisieren müssen und habe die tls_high_cipherlist
Deklaration daher auskommentiert.
Ich habe dann ein paar Dinge gemacht.
In Postfixes master.cf
habe ich -o smtp_tls_mandatory_protocols=TLSv1
wie empfohlen den SMTP-Abschnitt ergänzt.
Ich wollte die TLS-Protokolle verbessern, indem ich Deklarationen vonhttps://blog.kruyt.org/postfix-and-tls-encryption/, die TLSv1.2 und TLSv1.1 ausdrücklich genehmigen, bevor die älteren ausgeschlossen werden. Mit Postfix 2.6.6 funktioniert dies jedoch nicht; ich habe dies kurz nach einem Neuladen/Neustart im Protokoll gesehen:
warning: Invalid TLS protocol list "TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3": disabling TLS support
Dies passierte, wenn ich Ausschlussregeln mit Einschlussregeln vermischte, daher bin ich zum expliziten Ausschlussformat zurückgekehrt:
smtpd_tls_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_ciphers = high
smtpd_tls_ciphers = high
smtpd_tls_mandatory_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_ciphers = high
smtpd_tls_mandatory_ciphers = high
und dies wurde von Postfix akzeptiert.
Ich setze opportunistisches TLS mit
smtp_tls_security_level = may
smtpd_tls_security_level = may
Mir ist aufgefallen, dass selbst nach der Lösung des GMail-Zustellungsproblems einige andere MTAs weiterhin ausfielen:
server1 postfix/smtpd[28167]: connect from mta3.email.secretescapes.com[198.245.84.110]
server1 postfix/smtpd[28167]: setting up TLS connection from mta3.email.secretescapes.com[198.245.84.110]
server1 postfix/smtpd[28167]: mta3.email.secretescapes.com[198.245.84.110]: TLS cipher list "ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH:!MD5:!DES:!ADH:!RC4:!PSD:!SRP:!3DES:!eNULL:!aNULL"
server1 postfix/smtpd[28167]: SSL_accept:before/accept initialization
server1 postfix/smtpd[28167]: SSL_accept:error in SSLv2/v3 read client hello A
server1 postfix/smtpd[28167]: SSL_accept error from mta3.email.secretescapes.com[198.245.84.110]: -1
server1 postfix/smtpd[28167]: warning: TLS library problem: 28167:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:
server1 postfix/smtpd[28167]: lost connection after STARTTLS from mta3.email.secretescapes.com[198.245.84.110]
server1 postfix/smtpd[28167]: disconnect from mta3.email.secretescapes.com[198.245.84.110]
-
server1 postfix/smtpd[1451]: initializing the server-side TLS engine
server1 postfix/smtpd[1451]: connect from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: setting up TLS connection from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: mta.email.bbc.com[198.245.84.99]: TLS cipher list "ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH:!MD5:!aDSS:!kECDH:!kDH:!SEED:!IDEA:!DES:!ADH:!RC2:!RC4:!RC5:!PSD:!SRP:!3DES:!eNULL:!aNULL"
server1 postfix/smtpd[1451]: SSL_accept:before/accept initialization
server1 postfix/smtpd[1451]: SSL_accept:error in SSLv2/v3 read client hello A
server1 postfix/smtpd[1451]: SSL_accept error from mta.email.bbc.com[198.245.84.99]: -1
server1 postfix/smtpd[1451]: warning: TLS library problem: 1451:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:
server1 postfix/smtpd[1451]: lost connection after STARTTLS from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: disconnect from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: connect from unknown[107.174.30.57]
server1 postfix/smtpd[1451]: 4F6D0629C: client=unknown[107.174.30.57]
Ich habe dann ein paar Permutationen der tls_high_cipherlist ausprobiert, bevor ich schließlichdie empfohlene Liste von bettercrypto.org:
tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA
Der Server wurde mit verschiedenen SSL-Testern getestet, darunterCheckTLS(100% Ergebnis),Luxsci(Ergebnis: A+),SSL-Tester von htbridge(gute Note) undSSL-Tools.
Ich weiß, dass man ausgehende Verbindungen einer Richtlinienzuordnung unterziehen kann, aber ich suche nach einer entsprechenden Lösung, damit ich selektiv alle Ausschlüsse für bestimmte MTAs (wenn ich sie finde) deaktivieren und herausfinden kann, welche Verschlüsselung sie aushandeln, und dann die von mir präsentierte Verschlüsselungsliste anpassen kann.
Ich kann in der aktuellen Postfix-TLS-Konfiguration keine wirklich offensichtlichen Mängel erkennen. Ich verstehe nicht, warum bestimmte MTAs keine TLS-Verschlüsselung aushandeln können, während andere problemlos damit zurechtkommen. Sogar der anspruchsvollere MTA, GMail, ist jetzt in Ordnung.
Irgendwelche Ideen?:-)
ich habe zur Kenntnis genommendiese SE-Frage, warum Google die von ihm verwendete Chiffre bevorzugt, was eine interessante Lektüre war.
Mit freundlicher Genehmigung vondieser Postfix-Benutzer-Forumsthreadhabe ich ein nützliches Rezept gefunden, um schnell zu sehen, wie viele TLS-Verbindungen über alle verfügbaren Chiffren hinweg erfolgreich hergestellt wurden:
egrep "TLS connection established from.*with cipher" /var/log/maillog* | awk '{printf("%s %s %s %s\n", $12, $13, $14, $15)}' | sort | uniq -c | sort -
Antwort1
Letztendlich scheint dieses Problem darauf zurückzuführen zu sein, dass einige Absender immer noch nur SSLv3 aushandeln können. Das ist eine schlechte Sache, aber keine E-Mails zu erhalten ist auch nicht so toll.
So einfach ist das eigentlich. Ich bin damit nicht zufrieden, aber wenn sendende MTAs sich weigern, erneut auf TLS zu verhandeln und es immer wieder mit SSLv3 versuchen, können wir im Moment nicht viel tun.
Daher habe ich vorerst die Verschlüsselung eingehender E-Mails mit SSLv3 zugelassen, von allen Clients auf dem Server jedoch weiterhin eine Authentifizierung über TLS verlangt.
Dies habe ich erreicht, indem ich die Protokollnegatoren in Folgendem verringert habe main.cf
:
smtpd_tls_mandatory_protocols = !TLSv1, !SSLv2
smtpd_tls_protocols = !TLSv1, !SSLv2
Beachten Sie, dass die smtp_tls_
Definitionen für E-Mails gelten, die von diesem Server gesendet werden. Sie beziehen sich also auf Client-Verbindungen. Sie können diese also so streng festlegen, wie Sie möchten (solange Sie bereit sind, jedem zu erklären, wie er seinen E-Mail-Client einrichtet):
smtp_tls_mandatory_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = !TLSv1, !SSLv2, !SSLv3
Wenn sendende MTAs TLS nicht aushandeln können und SSLv3 erwartet wird, sehen Sie normalerweise Folgendes im Mailprotokoll:
warning: TLS library problem: 364:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:
Wenn Sie die Protokollierungsebene erhöhen, sehen Sie, dass die TLS-Aushandlung fehlschlägt, und es werden weitere Meldungen wie
postfix/smtpd[26234]: SSL_accept:before/accept initialization
postfix/smtpd[26234]: SSL_accept:error in SSLv2/v3 read client hello A
postfix/smtpd[26234]: SSL_accept error from 201-62-89-201.life.com.br[201.62.89.201]: -1
Ich habe das regelmäßige Sperren von SSLv3-Verbindungen getestet (die MTAs versuchen es zwangsläufig viele Tage lang erneut), sodass Sie in den Protokollen einige Fehler zulassen und diese dann analysieren können.
Dieses Bash-Skript hilft mir bei der Analyse, welche Server versuchen, SSLv3 zu verwenden:
#!/bin/sh
egrep "SSL_accept error" /var/log/maillog | awk '{printf("%s %s %s\n", $9, $10, $11)}' | sort | uniq -c | sort -`
Und diese Variante zeigt ausgehandelte Chiffren. Wenn Sie SSLv3 also wieder aktivieren, können Sie es eine Weile so lassen und dann bestätigen, dass MTAs SSLv3 verwenden:
#!/bin/sh
egrep "TLS connection established from.*with cipher" /var/log/maillog | awk '{printf("%s %s %s %s\n", $12, $13, $14, $15)}' | sort | uniq -c | sort -
Ich habe noch keine bessere Antwort gefunden. Ich würde gerne einen differenzierteren Ansatz verfolgen und SSLv3 selektiv für bestimmte MTAs zulassen können, je nachdem, ob ihre Verbindungsversuche mit bestimmten Fehlern fehlschlagen maillog
. Alle Kommentare/Vorschläge sind willkommen.