Назад | Перейти на главную страницу

Roundcube + Dovecot: ошибки SSL при попытке авторизации

Я настраиваю почтовый сервер с помощью Dovecot 2.2.13, Postfix 2.11.3 и с подключением к нему Roundcube 1.1.1. Roundcube работает на другом сервере в nginx / php-fpm. Оба сервера работают под управлением Debian Jessie с последними обновлениями и могут пинговать друг друга. Nmap от хоста Roundcube показывает, что порт 993 открыт и доступен. Кроме того, мне кажется, что я получаю соединение с правильными портами, но я не могу заставить Roundcube успешно подключиться к Dovecot.

Dovecot настроен со следующими настройками SSL, работающими на порте 993:

/etc/dovecot/conf.d/10-ssl.conf

ssl_protocols = TLSv1.2 TLSv1.1 TLSv1 !SSLv2 !SSLv3
ssl_cipher_list = ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES128:DH+AES:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5

/etc/dovecot/dovecot.conf

auth_verbose=yes
auth_debug=yes
auth_debug_passwords=yes
mail_debug=yes
verbose_ssl=yes
auth_verbose_passwords=plain

С этими настройками я могу получить TLS-соединение из почтового приложения Android и получать почту, поэтому я знаю, что Dovecot прослушивает и может общаться. Roundcube размещен на сервере, отличном от Dovecot, и настроен со следующими настройками в отношении IMAPS.

$config['default_host'] = 'tls://mail.domain.tld';
$config['imap_conn_options'] => array(
    'ssl' => array(
        'ciphers' => 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES128:DH+AES:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5',
    ),
);

Успешный вход в систему выглядит примерно так в mail.log:

dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges
dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges
dovecot: imap-login: Debug: SSL: where=0x10, ret=1: before/accept initialization [zzz.zzz.zzz.zzz]
dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: before/accept initialization [zzz.zzz.zzz.zzz]
dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz]
dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz]
dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz]
dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz]
dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz]
dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz]
dovecot: imap-login: Debug: SSL: where=0x2002, ret=-1: unknown state [zzz.zzz.zzz.zzz]
dovecot: imap-login: Debug: SSL: where=0x2002, ret=-1: unknown state [zzz.zzz.zzz.zzz]
dovecot: auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth
dovecot: auth: Debug: Read auth token secret from /var/run/dovecot/auth-token-secret.dat
dovecot: auth: Debug: auth client connected (pid=5986)
dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz]
dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz]
dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz]
dovecot: imap-login: Debug: SSL: where=0x20, ret=1: SSL negotiation finished successfully [zzz.zzz.zzz.zzz]
dovecot: imap-login: Debug: SSL: where=0x2002, ret=1: SSL negotiation finished successfully [zzz.zzz.zzz.zzz]

А вот неудачный выглядит так в mail.log:

dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges
dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges
dovecot: auth: Debug: auth client connected (pid=5993)
dovecot: imap-login: Debug: SSL: where=0x10, ret=1: before/accept initialization [xxx.xxx.xxx.xxx]
dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: before/accept initialization [xxx.xxx.xxx.xxx]
dovecot: imap-login: Debug: SSL: where=0x202, ret=-1: SSLv2/v3 read client hello A [xxx.xxx.xxx.xxx]
dovecot: imap-login: Disconnected (no auth attempts in 60 secs): user=<> rip=xxx.xxx.xxx.xxx, lip=yyy.yyy.yyy.yyy, TLS handshaking: Disconnected, session=<xxxxxxxxxxxxxx>

Ошибка, которую регистрирует Roundcube:

<sj148mqa> IMAP Error: Login failed for firstname.lastname@domain.tld from xxx.xxx.xxx.xxx. Empty startup greeting (mail.domain.tld:993) in /var/www/roundcube/program/lib/Roundcube/rcube_imap.php on line 198 (POST /roundcube/?_task=login?_task=login&_action=login)

Кажется, что Roundcube игнорирует мои tls: // и пытается подключиться к Dovecot с помощью SSLv2 / v3, который Dovecot настроен игнорировать. Итак, пока Dovecot ожидает, пока Roundcube начнет квитирование TLS, Roundcube ждет приветствия сервера, которое никогда не приходит. Есть ли способ настроить Roundcube для успешного подключения? Я пропустил что-то очень простое при настройке конфигурации?

РЕДАКТИРОВАТЬ:

По предложению Пола я попытался открыть порт 143 и разрешить Roundcube использовать STARTTLS. Мне удалось установить соединение, но только если verify_peer был отключен. Изменение значений verify_peer_name и добавление пути как к цепочке CA, связанной с почтовым сервером, так и к связанному сертификату почтового сервера, не позволило мне получить соединение с verify_peer = true.

Я считаю, что это означает, что мой сертификат SSL соответствует моему имени хоста. Есть две записи DNS для почтового сервера, указывающие на один и тот же адрес: одна для hostname.domain.tld и одна для mail.domain.tld. Может ли это быть причиной сбоя одноранговой проверки?

Различное значение tls:// и ssl:// в $config['default_host'] К сожалению, документально не подтверждено.

  • tls:// означает использование STARTTLS, поэтому обычно порт 143
  • ssl:// означает использование TLS, обычно порт 993

  • То же самое верно для $config['smtp_server'] и порты 25 и 587 для tls://, порты 465 для ssl://.

Не могу указать какой-либо источник этой информации, поскольку я (и некоторые другие) получил это эмпирически.


И для verify_peer проблема, сначала посмотрите на обслуживаемый сертификат. Например. используя эту команду с подключающегося компьютера:

echo | openssl s_client -connect mail.fizeau.net:143 -starttls imap -showcerts 2>&1 | openssl x509 -noout -text | egrep 'Subject: |DNS:'

Это покажет вам домены, для которых был выдан сертификат.