Kilka dni temu Gmail nagle postanowił przestać wysyłać wiadomości na mój serwer pocztowy. Używam Postfix i Dovecot z płatnym certyfikatem SSL działającym na Debian 7 ze wszystkim zaktualizowanym.
Mój mail.log
pokazuje następujący błąd:
Dec 19 11:09:11 server postfix/smtpd[19878]: initializing the server-side TLS engine
Dec 19 11:09:11 server postfix/tlsmgr[19880]: open smtpd TLS cache btree:/var/lib/postfix/smtpd_scache
Dec 19 11:09:11 server postfix/tlsmgr[19880]: tlsmgr_cache_run_event: start TLS smtpd session cache cleanup
Dec 19 11:09:11 server postfix/smtpd[19878]: connect from mail-wi0-x230.google.com[2a00:1450:400c:c05::230]
Dec 19 11:09:11 server postfix/smtpd[19878]: setting up TLS connection from mail-wi0-x230.google.com[2a00:1450:400c:c05::230]
Dec 19 11:09:11 server postfix/smtpd[19878]: mail-wi0-x230.google.com[2a00:1450:400c:c05::230]: TLS cipher list "aNULL:-aNULL:ALL:+RC4:@STR ENGTH:!aNULL:!DES:!3DES:!MD5:!DES+MD5:!RC4:!RC4-MD5"
Dec 19 11:09:11 server postfix/smtpd[19878]: SSL_accept:before/accept initialization
Dec 19 11:09:11 server postfix/smtpd[19878]: SSL_accept:error in unknown state
Dec 19 11:09:11 server postfix/smtpd[19878]: SSL_accept error from mail-wi0-x230.google.com[2a00:1450:400c:c05::230]: -1
Dec 19 11:09:11 server postfix/smtpd[19878]: warning: TLS library problem: 19878:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:
Dec 19 11:09:11 server postfix/smtpd[19878]: lost connection after STARTTLS from mail-wi0-x230.google.com[2a00:1450:400c:c05::230]
Dec 19 11:09:11 server postfix/smtpd[19878]: disconnect from mail-wi0-x230.google.com[2a00:1450:400c:c05::230]
fragmenty mojego postfiksa main.cf
:
smtpd_use_tls=yes
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_CAfile = path to CA Bundle
smtpd_tls_cert_file= path to cert (pem)
smtpd_tls_key_file=path to key (pem)
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1
smtpd_tls_exclude_ciphers = aNULL, DES, 3DES, MD5, DES+MD5, RC4, RC4-MD5
smtpd_tls_protocols=!SSLv2,!TLSv1,!TLSv1.1,!SSLv3
smtpd_tls_mandatory_ciphers = medium
smtpd_tls_received_header = yes
tls_preempt_cipherlist = yes
tls_medium_cipherlist = AES256+EECDH:AES256+EDH
Nie wiem, na czym polega problem, ponieważ regularnie otrzymuję maile od innych. Nie ma błędów podczas łączenia z portem 25 przez telnet lub portem 465 przez openssl
Dodatek: otrzymałem tę wiadomość w zamian od Google:
Delivery to the following recipient failed permanently:
<removed>
Technical details of permanent failure:
TLS Negotiation failed
----- Original message -----
[...]
Może to problem z moją listą szyfrów?
Odpowiedz na pytanie masegaloeh:
openssl s_client -connect localhost:25 -starttls smtp
CONNECTED(00000003)
depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
[...]
---
Server certificate
-----BEGIN CERTIFICATE-----
[...]
---
No client certificate CA names sent
---
SSL handshake has read 6267 bytes and written 477 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: zlib compression
Expansion: zlib compression
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: [...]
Session-ID-ctx:
Master-Key: [...]
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 3600 (seconds)
TLS session ticket: [...]
Compression: 1 (zlib compression)
Start Time: 1418986680
Timeout : 300 (sec)
Verify return code: 19 (self signed certificate in certificate chain)
---
250 DSN
Aktualizacja 1:
Wydałem ponownie mój certyfikat SSL. Wygenerowano wszystko w następujący sposób:
openssl req -nodes -newkey rsa:2048 -keyout myserver.key -out server.csr -sha256
Następnie utworzyłem nowy plik składający się z crt
i key
, a następnie utworzyłem pakiet CA:
cat COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > bundle.crt
Dodałem wszystko do mojej konfiguracji dovecot i Postfix i zrestartowałem obie usługi.
Google nadal nie wysyła wiadomości e-mail z mojego serwera, co powodujeTLS Negotiation failed
Wypróbowałem innego dostawcę poczty (web.de) i wiadomość została wysłana.
dziennik web.de:
Dec 19 17:33:15 server postfix/smtpd[14105]: connect from mout.web.de[212.227.15.3]
Dec 19 17:33:15 server postfix/smtpd[14105]: setting up TLS connection from mout.web.de[212.227.15.3]
Dec 19 17:33:15 server postfix/smtpd[14105]: mout.web.de[212.227.15.3]: TLS cipher list "aNULL:-aNULL:ALL:+RC4:@STRENGTH"
Dec 19 17:33:15 server postfix/smtpd[14105]: mout.web.de[212.227.15.3]: save session EA1635ED786AFC2D9C7AB43EF43620A1D9092DC640FDE21C01E7BA25981D2445&s=smtp&l=268439647 to smtpd cache
Dec 19 17:33:15 server postfix/tlsmgr[14107]: put smtpd session id=EA1635ED786AFC2D9C7AB43EF43620A1D9092DC640FDE21C01E7BA25981D2445&s=smtp&l=268439647 [data 127 bytes]
Dec 19 17:33:15 server postfix/tlsmgr[14107]: write smtpd TLS cache entry EA1635ED786AFC2D9C7AB43EF43620A1D9092DC640FDE21C01E7BA25981D2445&s=smtp&l=268439647: time=1419006795 [data 127 bytes]
Dec 19 17:33:15 server postfix/smtpd[14105]: Anonymous TLS connection established from mout.web.de[212.227.15.3]: TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Soultion:
Po włączeniu TLSv1
i TLSv1.1
na smtpd_(mandatory)_protocols
grzywny Dostawy SEKCJA wszystko. Dzięki masegaloeh !
Dec 20 11:44:46 server postfix/smtpd[31966]: initializing the server-side TLS engine
Dec 20 11:44:46 server postfix/tlsmgr[31968]: open smtpd TLS cache btree:/var/lib/postfix/smtpd_scache
Dec 20 11:44:46 server postfix/tlsmgr[31968]: tlsmgr_cache_run_event: start TLS smtpd session cache cleanup
Dec 20 11:44:46 server postfix/smtpd[31966]: connect from mail-wi0-x235.google.com[2a00:1450:400c:c05::235]
Dec 20 11:44:46 server postfix/smtpd[31966]: setting up TLS connection from mail-wi0-x235.google.com[2a00:1450:400c:c05::235]
Dec 20 11:44:46 server postfix/smtpd[31966]: mail-wi0-x235.google.com[2a00:1450:400c:c05::235]: TLS cipher list "aNULL:-aNULL:ALL:+RC4:@STRENGTH"
Dec 20 11:44:46 server postfix/smtpd[31966]: Anonymous TLS connection established from mail-wi0-x235.google.com[2a00:1450:400c:c05::235]: TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)
openssl s_client -connect localhost:25 -starttls smtp
?Odpowiedzi:
TLDR : Twoje protokoły TLS są zbyt surowe, ponieważ zezwalasz tylko na połączenie TLSv1.2.
A GMAIL wysyła wiadomość e-mail na Twój serwer za pomocą protokołu TLSv1 . Dlatego negocjacja TLS kończy się niepowodzeniem.
Oczywistym rozwiązaniem jest zezwolenie na protokoły TLSv1 i TLSv1.1 oraz nadal wyłączanie (niepewnych) protokołów SSLv2 i SSLv3.
Wyjaśnienie
Mogę potwierdzić Twoją sprawę, gdy nie otrzymuję wiadomości e-mail od GMAIL i FACEBOOK przez STARTTLS .
Dlaczego tylko GMAIL, który nie wysyła wiadomości e-mail na mój serwer
To fragment kodu maillog, gdy GMAIL wysyła wiadomość e-mail
I to jest fragment maillog, gdy FACEBOOK wysyła e-mail
Trochę analizy
To wyjaśnia, dlaczego tylko GMAIL nie wysyła wiadomości e-mail na Twój serwer. GMAIL nie ma mechanizmu awaryjnego, jeśli negocjacja TLS nie powiedzie się . Inny serwer pocztowy może korzystać z mechanizmu awaryjnego, aby zapewnić pomyślne dostarczenie wiadomości e-mail.
Dlaczego występuje błąd negocjacji TLS
Dostrzegam ciekawą linię z web.de maillog
I dowiedz się, że określasz tę konfigurację w
main.cf
Oznacza to, że Twój serwer akceptuje połączenie TLS tylko wtedy, gdy używany jest TLSv1.2. Inny niż TLSv1.2, twój serwer będzie narzekał na błąd negocjacji TLS.
Jeśli zmienię
smtpd_tls_(mandatory_)protocols
na!SSLv2,!SSLv3,!TLSv1
, błąd nadal występuje. Oznacza to, że GMAIL i FACEBOOK spróbują skontaktować się z Twoim serwerem pocztowym przy użyciu protokołów innych niż TLSv1.1 i TLSv1.2.Jeśli zmienię
smtpd_tls_(mandatory_)protocols
na!SSLv2,!SSLv3
, negocjacje TLS zakończą się powodzeniem. Potwierdza, że GMAIL i FACEBOOK skontaktują się z Twoim serwerem za pomocą protokołu TLSv1Inni ludzie na forum FreeBSD również potwierdzają to zachowanie.
Rozwiązanie
Oczywistym rozwiązaniem jest włączenie TLSv1 i TLSv1.1 w Postfiksie. Zapewni to, że niektóre serwery pocztowe, które nie mają mechanizmu awaryjnego - takie jak GMAIL - będą mogły nadal komunikować się z twoim serwerem.
Nie znam Twojego powodu, aby wyłączyć obsługę TLSv1 i TLSv1.1, pozostawiając tylko protokół TLSv1.2. Jeśli jest to serwer sieciowy, a użytkownik będzie korzystał tylko z nowoczesnej przeglądarki, możesz wyłączyć protokół TLSv1 na serwerze. Jest to dopuszczalne, ponieważ tylko starsza przeglądarka, która nie obsługuje protokołu TLSv1 .
źródło
Jednym z potencjalnych problemów, które widzę, jest oczywiste użycie certyfikatu z podpisem własnym, zgłoszonego przez OpenSSL:
Jeśli korzystasz z płatnego certyfikatu SSL, nie powinieneś używać certyfikatu z podpisem własnym.
Sprawdziłbym, czy plik PEM zawiera płatny certyfikat, a także czy zawiera pełny łańcuch certyfikatów.
źródło
code: 19 (self signed certificate)
code 19
wiadomości, jeśli Twój pełny łańcuch jest obsługiwany. Korzystam z certyfikatu StartSSL, który daje ten sam błąd w górnej części polecenia, ale ponieważ zapewniam pełny łańcuch (w tym główny urząd certyfikacji) wsmtpd_tls_cert_file
pliku PEM, klient ma wszystkie certyfikaty niezbędne do zweryfikowania pełnego łańcucha .