Roundcube + Dovecot: erros de SSL ao tentar efetuar login

2

Estou configurando um servidor de e-mail usando o Dovecot 2.2.13, o Postfix 2.11.3 e com o Roundcube 1.1.1 conectado a ele. O Roundcube está sendo executado em um servidor diferente em nginx / php-fpm. Ambos os servidores estão executando o Debian Jessie com as atualizações mais recentes e podem pingar um ao outro. Um nmap do host do Roundcube mostra a porta 993 aberta e acessível. Além disso, parece que tenho uma conexão nas portas certas, mas não consigo fazer com que o Roundcube se conecte ao Dovecot com sucesso.

O Dovecot é configurado com as seguintes configurações SSL em execução na porta 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

Com essas configurações, consigo obter uma conexão TLS a partir do aplicativo de e-mail do Android e receber e-mails, por isso sei que o Dovecot está escutando e é capaz de se comunicar. O Roundcube é hospedado em um servidor diferente do Dovecot e é configurado com as seguintes configurações em relação ao 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',
    ),
);

O login bem-sucedido é parecido com isto em 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]

Considerando que um sem sucesso se parece com isso em 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>

O erro que o Roundcube registra é:

<sj148mqa> IMAP Error: Login failed for [email protected] 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)

O que parece é que o Roundcube está ignorando minha diretiva tls: // e tentando se conectar ao Dovecot usando SSLv2 / v3 que o Dovecot está configurado para ignorar. Assim, enquanto o Dovecot espera que o Roundcube inicie o handshaking TLS, o Roundcube está aguardando uma saudação do servidor que nunca está chegando. Existe alguma maneira de configurar o Roundcube para se conectar com sucesso? Eu perdi algo muito simples na minha configuração?

EDITAR:

Por sugestão do Paul, tentei abrir a porta 143 e permitir que o Roundcube usasse o STARTTLS. Consegui obter uma conexão, mas apenas se verify_peer estivesse desativado. Alterar os valores de verify_peer_name e adicionar o caminho para a cadeia CA associada ao servidor de e-mail e o certificado de servidor de e-mail encadeado não me permitiu obter uma conexão com verify_peer = true .

Acredito que isso significa que há um problema com meu certificado SSL que corresponde ao meu nome de host. Existem duas entradas DNS para o servidor de mensagens apontando para o mesmo endereço para hostname.domain.tld e um para mail.domain.tld. Isso poderia estar causando falha na verificação de peers?

    
por Aetherith 07.05.2015 / 07:07

1 resposta

5

O significado diferente de tls:// e ssl:// em $config['default_host'] infelizmente não está documentado.

  • tls:// significa o uso de STARTTLS, portanto, geralmente a porta 143
  • ssl:// significa o uso de TLS, portanto, geralmente a porta 993

  • O mesmo é válido para $config['smtp_server'] e portas 25 e 587 para tls:// , portas 465 para ssl:// .

Não é possível fornecer nenhuma fonte para essa informação, pois eu (e alguns outros) a obtive empiricamente.

E para o problema verify_peer , primeiro examine o certificado que é exibido. Por exemplo. usando este comando da máquina de conexão:

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

Isso mostrará os domínios para os quais o certificado foi emitido.

    
por 15.05.2015 / 23:35