После февральской/мартовской лавины сообщений в СМИ о необходимости скорейшего обновления старых версий в связи с обнаружением критических уязвимостей, решили обновиться.
Почтовый сервер у нас непростительно долго (около полутора лет) не обновлялся, поэтому все основные версии пакетов и ядра системы уже отстали от времени.
До обновления Exim был версии 4.84.2-2. Работает в связке с dovecot. Операционная система CentOS 7.2.1511. Сертификат используем самозаверенный, на доменные клиентские машины распространяется через GPO(устанавливается в Доверенные). Если машина не в домене, ставим ручками. Сертификат мультидоменный - у "статичных" пользователей почтовый сервер прописан по локальному dns-имени (mail.domain.local), у разных командировочных и прочих - по внешнему (mail.company.ru).
На большинстве рабочих мест в качестве почтового клиента - Windows Live Mail 2009 и 2012 (прошу только не писать - выкиньте ваш клиент, вы же знаете, что такое - "исторически сложилось"). Есть ещё совсем немного Thunderbird и Outlook Express на оставшихся Windows XP. Сам сервер находится за шлюзом и напрямую в интернет не смотрит (поэтому в логах далее: 192.168.1.2-это локальный адрес почтового сервера, 111.111.111.111 - внешний адрес, по которому он доступен, по факту - шлюз)
Все строки exim.conf, которые обеспечивают работу SMTP-сервера через SSL, стандартные, но всё равно перечислю:
Код: Выделить всё
daemon_smtp_ports = 25 : 465
tls_on_connect_ports = 465
tls_advertise_hosts = *
tls_certificate = /etc/pki/dovecot/certs/companymail.crt
tls_privatekey = /etc/pki/dovecot/private/companymail.key
SSL-соединение с сервером входящей почты (по IMAP, порт 993) установилось и отработало как надо. При отправке же возникли проблемы (и dovecot и exim работают с одним и тем же сертификатом). Проблема снаружи выглядит так: когда в клиенте после оформления письма нажимаешь "Отправить", моментально возвращается ошибка 0x800ccc0f, означающая, что соединение было прервано сервером. В main.log при этом дважды пишется строка:
Код: Выделить всё
TLS error on connection from (companygate) [111.111.111.111] I=[192.168.1.2]:465 (SSL_accept): error:00000000:lib(0):func(0):reason(0)
На этом этапе есть интересный момент. Специфика работы клиента Windows Live Mail заключается в том, что перед непосредственной отправкой он кладёт сформированное письмо в локальную папку "Исходящие". Если письмо по какой-то причине не отправится, оно остаётся висеть на компьютере-клиенте в этой папке. Что-то вроде локальной очереди писем. Так вот после возвращения ошибки письмо лежит именно там. И если нажать в клиенте кнопку принудительной синхронизации "Отправить и получить", то это же письмо уходит без проблем и каких-либо ошибок. Таким образом, проблема возникает только при первой попытке отправки и только при использовании SSL. При отключении SSL соединяется нормально.
На этом этапе, поскольку время поджимало, мы решили остановиться и откатиться на работоспособное состояние. Подумали, что лучше всё-таки обновить полностью все пакеты, поэтапно проверяя работоспособность связки клиент-сервер, чтобы определить - обновление какого из пакетов вызывает проблемы.
Было установлено, что обновление абсолютно всех пакетов, кроме самого Exim, проблем не вызывает. Обновили всё, что возможно было - отправка работала. Как только обновляешь Exim, отправка работать перестаёт.
Также было установлено, что проблема не со всеми клиентами. Thunderbird, коммерческий MS Office Outlook 2003 и Windows Live Mail 2009 продолжают работать нормально. Windows Live Mail 2012 (80% машин) и Outlook Express выдают ошибку. Даже если "сервер хороший, а клиент плохой" у нас нет возможности быстро перевести всех на другие клиенты.
Забегая вперёд скажу, что сегодня попробовали поднять с нуля почтовый сервер в минимальной конфигурации для тестового домена также с самоподписным сертификатом и получили тот же результат.
С помощью Wireshark было установлено, что проблема точно возникает на этапе TLS Handshake. Схема установки соединения TLS: https://habrastorage.org/files/e52/387/ ... 310962.png. Приведу разницу между нормальной установкой соединения на "старом" Exim'е (её отображением в Wireshark) и неудачной - после обновления. 192.168.1.166 - клиентский компьютер. 1.2 - почтовый сервер. Может быть, есть специалисты, кто может помочь "расшифровать" сведения. Понятно, что подробности о каждом соединении здесь не указаны.
Нормальная:
Код: Выделить всё
num time source destination protocol length info
346 9.100071 192.168.1.166 192.168.1.2 TCP 66 47750 → 465 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
347 9.100581 192.168.1.2 192.168.1.166 TCP 66 465 → 47750 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460 SACK_PERM=1 WS=128
348 9.100652 192.168.1.166 192.168.1.2 TCP 54 47750 → 465 [ACK] Seq=1 Ack=1 Win=65536 Len=0
349 9.101697 192.168.1.166 192.168.1.2 TLSv1 214 Client Hello
350 9.102760 192.168.1.2 192.168.1.166 TCP 60 465 → 47750 [ACK] Seq=1 Ack=161 Win=30336 Len=0
#Server Hello здесь передаётся отдельно от остальных команд
352 9.171150 192.168.1.2 192.168.1.166 TLSv1 1514 Server Hello
353 9.171151 192.168.1.2 192.168.1.166 TLSv1 1388 Certificate, Server Key Exchange, Server Hello Done
354 9.171218 192.168.1.166 192.168.1.2 TCP 54 47750 → 465 [ACK] Seq=161 Ack=2795 Win=65536 Len=0
357 9.202821 192.168.1.166 192.168.1.2 TLSv1 380 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
358 9.203292 192.168.1.2 192.168.1.166 TCP 60 465 → 47750 [ACK] Seq=2795 Ack=487 Win=31360 Len=0
359 9.219767 192.168.1.2 192.168.1.166 TLSv1 113 Change Cipher Spec, Encrypted Handshake Message
360 9.220768 192.168.1.2 192.168.1.166 TLSv1 160 Application Data, Application Data
361 9.220833 192.168.1.166 192.168.1.2 TCP 54 47750 → 465 [ACK] Seq=487 Ack=2960 Win=65280 Len=0
# установка соединения завершена, дальше идут данные приложения
362 9.221942 192.168.1.166 192.168.1.2 TLSv1 107 Application Data
363 9.223354 192.168.1.2 192.168.1.166 TLSv1 272 Application Data, Application Data
Код: Выделить всё
num time source destination protocollength info
751 12.751110 192.168.1.166 192.168.1.2 TCP 66 48132 → 465 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
752 12.752935 192.168.1.2 192.168.1.166 TCP 66 465 → 48132 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460 SACK_PERM=1 WS=128
753 12.753031 192.168.1.166 192.168.1.2 TCP 54 48132 → 465 [ACK] Seq=1 Ack=1 Win=65536 Len=0
754 12.754423 192.168.1.166 192.168.1.2 TLSv1 215 Client Hello
755 12.755644 192.168.1.2 192.168.1.166 TCP 60 465 → 48132 [ACK] Seq=1 Ack=162 Win=30336 Len=0
# строкой ниже уже видно различие в механизме. Server Hello передаётся со всеми командами
# после этого соединение закрывается (FIN)
756 12.761649 192.168.1.2 192.168.1.166 TLSv1 1078 Server Hello, Certificate, Server Key Exchange, Server Hello Done
757 12.764940 192.168.1.166 192.168.1.2 TCP 54 48132 → 465 [FIN, ACK] Seq=162 Ack=1025 Win=64512 Len=0
758 12.766093 192.168.1.166 192.168.1.2 TCP 66 48133 → 465 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
759 12.767251 192.168.1.2 192.168.1.166 TCP 60 465 → 48132 [FIN, ACK] Seq=1025 Ack=163 Win=30336 Len=0
760 12.767374 192.168.1.166 192.168.1.2 TCP 54 48132 → 465 [ACK] Seq=163 Ack=1026 Win=64512 Len=0
761 12.767645 192.168.1.2 192.168.1.166 TCP 66 465 → 48133 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460 SACK_PERM=1 WS=128
762 12.767715 192.168.1.166 192.168.1.2 TCP 54 48133 → 465 [ACK] Seq=1 Ack=1 Win=65536 Len=0
763 12.767969 192.168.1.166 192.168.1.2 TCP 54 48133 → 465 [FIN, ACK] Seq=1 Ack=1 Win=65536 Len=0
764 12.769393 192.168.1.2 192.168.1.166 TCP 60 465 → 48133 [ACK] Seq=1 Ack=2 Win=29312 Len=0
765 12.773645 192.168.1.2 192.168.1.166 TCP 60 465 → 48133 [FIN, ACK] Seq=1 Ack=2 Win=29312 Len=0
766 12.773748 192.168.1.166 192.168.1.2 TCP 54 48133 → 465 [ACK] Seq=2 Ack=2 Win=65536 Len=0
Код: Выделить всё
exim -d-all+tls -bd
Код: Выделить всё
[root@mail:exim -d-all+tls -bd
Exim version 4.90_1 uid=0 gid=0 pid=3104 D=8000000
Berkeley DB: Berkeley DB 5.3.21: (May 11, 2012)
Support for: crypteq iconv() IPv6 PAM Perl Expand_dlfunc OpenSSL Content_Scanning DKIM DNSSEC Event OCSP PRDR TCP_Fast_Open
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmjz dbmnz dnsdb dsearch ldap ldapdn ldapm nis nis0 nisplus passwd sqlite
Authenticators: cram_md5 cyrus_sasl dovecot gsasl plaintext spa tls
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp
Fixed never_users: 0
Configure owner: 0:0
Size of off_t: 8
Compiler: GCC [4.8.5 20150623 (Red Hat 4.8.5-16)]
Library version: Glibc: Compile: 2.17
Runtime: 2.17
Library version: OpenSSL: Compile: OpenSSL 1.0.2k-fips 26 Jan 2017
Runtime: OpenSSL 1.0.2k-fips 26 Jan 2017
: built on: reproducible build, date unspecified
Library version: Cyrus SASL: Compile: 2.1.26
Runtime: 2.1.26 [Cyrus SASL]
Library version: GNU SASL: Compile: 1.8.0
Runtime: 1.8.0
Library version: PCRE: Compile: 8.32
Runtime: 8.32 2012-11-30
Library version: MySQL: Compile: 50556 5.5.56-MariaDB [mariadb-5.5]
Runtime: 50556 5.5.56-MariaDB
Exim version 4.90_1
Library version: SQLite: Compile: 3.7.17
Runtime: 3.7.17
WHITELIST_D_MACROS unset
TRUSTED_CONFIG_LIST: "/etc/exim/trusted-configs"
tls_validate_require_cipher child 3105 ended: status=0x0
LOG: MAIN
configuration file is /etc/exim/exim.conf
log selectors = 0000cefe 0c670482
cwd=/etc/exim 3 args: exim -d-all+tls -bd
trusted user
admin user
3104 listening on all interfaces (IPv4) port 25
3104 listening on all interfaces (IPv4) port 465
3104 pid written to /var/run/exim.pid
3104 LOG: MAIN
3104 exim 4.90_1 daemon started: pid=3104, no queue runs, listening for SMTP on port 25 (IPv4) and for SMTPS on port 465 (IPv4)
3104 daemon running with uid=93 gid=93 euid=93 egid=93
3104 Listening...
3104 Connection request from 111.111.111.111 port 12058
3104 1 SMTP accept process running
3104 Listening...
3106 Process 3106 is handling incoming connection from [111.111.111.111]
3106 setting SSL CTX options: 0x1104000
3106 Diffie-Hellman initialized from default with 2048-bit prime
3106 ECDH OpenSSL 1.0.2+ temp key parameter settings: autoselection
3106 tls_certificate file /etc/pki/dovecot/certs/companymail.crt
3106 tls_privatekey file /etc/pki/dovecot/private/companymail.key
3106 Initialized TLS
3106 Calling SSL_accept
3106 SSL info: before/accept initialization
3106 SSL info: before/accept initialization
3106 Received TLS SNI "mail.domain.local" (unused for certificate selection)
3106 SSL info: SSLv3 read client hello A
3106 SSL info: SSLv3 write server hello A
3106 SSL info: SSLv3 write certificate A
3106 SSL info: SSLv3 write key exchange A
3106 SSL info: SSLv3 write server done A
3106 SSL info: SSLv3 flush data
3106 SSL info: SSLv3 read client certificate A
3106 SSL info: SSLv3 read client key exchange A
3106 LOG: MAIN
3106 TLS error on connection from (companygate) [111.111.111.111] I=[192.168.1.2]:465 (SSL_accept): error:00000000:lib(0):func(0):reason(0)
3104 Connection request from 111.111.111.111 port 12059
3104 2 SMTP accept processes running
3104 Listening...
3107 Process 3107 is handling incoming connection from [111.111.111.111]
3107 setting SSL CTX options: 0x1104000
3107 Diffie-Hellman initialized from default with 2048-bit prime
3107 ECDH OpenSSL 1.0.2+ temp key parameter settings: autoselection
3107 tls_certificate file /etc/pki/dovecot/certs/companymail.crt
3107 tls_privatekey file /etc/pki/dovecot/private/companymail.key
3107 Initialized TLS
3107 Calling SSL_accept
3107 SSL info: before/accept initialization
3107 SSL info: before/accept initialization
3107 LOG: MAIN
3107 TLS error on connection from (companygate) [111.111.111.111] I=[192.168.1.2]:465 (SSL_accept): error:00000000:lib(0):func(0):reason(0)
3104 child 3106 ended: status=0x0
3104 normal exit, 0
3104 1 SMTP accept process now running
3104 child 3107 ended: status=0x0
3104 normal exit, 0
3104 0 SMTP accept processes now running
3104 Listening...
Код: Выделить всё
3850 Calling SSL_accept
3850 SSL info: before/accept initialization
3850 SSL info: before/accept initialization
3850 Received TLS SNI "mail.domain.local" (unused for certificate selection)
3850 SSL info: SSLv3 read client hello A
3850 SSL info: SSLv3 write server hello A
3850 SSL info: SSLv3 write certificate A
3850 SSL info: SSLv3 write key exchange A
3850 SSL info: SSLv3 write server done A
3850 SSL info: SSLv3 flush data
3850 SSL info: SSLv3 read client certificate A
3850 SSL info: SSLv3 read client key exchange A
3850 SSL info: SSLv3 read certificate verify A
3850 SSL info: SSLv3 read finished A
3850 SSL info: SSLv3 write change cipher spec A
3850 SSL info: SSLv3 write finished A
3850 SSL info: SSLv3 flush data
3850 SSL info: SSL negotiation finished successfully
3850 SSL info: SSL negotiation finished successfully
3850 SSL_accept was successful
- перевыпустить заново сертификат - с разными длинами ключа и алгоритмами хэша. Без изменений. Входящая почта работает как надо. Отправка - с первого раза не проходит.
- активировать дополнительные опции openssl (добавил в конфиг параметр openssl_options) в различных комбинациях. Как написано на exim.org:
Код: Выделить всё
# Make both old MS and old Eudora happy:
openssl_options = -all +microsoft_big_sslv3_buffer +dont_insert_empty_fragments
# Disable older protocol versions:
openssl_options = +no_sslv2 +no_sslv3
Код: Выделить всё
openssl s_client -connect mail.company.ru:465
Следующим этапом хотим попробовать использовать полноценный сертификат, заверяемый доверенным УЦ, возможно, Let's Encrypt.
Будем благодарны Вам, если Вы долистали до этого момента, а в особенности - если выскажете, какие-то мысли.
Заранее спасибо.