使 roundcube 与 dovecot、postfix 和 letsencrypt 协同工作

使 roundcube 与 dovecot、postfix 和 letsencrypt 协同工作

我正在尝试让 roundcube、dovecot、postfix 和 letsencrypt 的证书在 Debian 9 上协同工作。

我使用 apt-get 命令安装了 roundcube。

尝试登录 roundcube 时,需要很长时间,然后显示“正在加载...”,但无法登录。屏幕上显示错误Connection to storage server failed。查看 roundcube 错误日志,我收到以下错误:

IMAP Error: Login failed for [email protected] from 192.0.2.10. Empty startup greeting (localhost:143) in /usr/share/roundcube/program/lib/Roundcube/rcube_imap.php on line 193 (POST /?_task=login&_action=login)

运行/etc/init.d/dovecot status我得到以下信息:

dovecot[29431]: imap-login: Disconnected (no auth attempts in 60 secs): user=<>, rip=::1, lip=::1, TLS handshaking: SSL_accept() syscall failed: Success, session=<azgn6uptGtgAAAAAAAAAAAAAAAAAAAAB>

我的 config.inc.php 中有以下内容:

$config['default_host'] = 'tls://localhost';

$config['imap_conn_options'] = array(
   'ssl'         => array(
     'verify_peer'  => false,
     'verify_peer_name' => false,
    ),
);

$config['username_domain'] = '%d';

并且在我的 dovecot 10-ssl.conf 文件中指定了以下内容:

ssl = required

ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.com/privkey.pem

我的 10-master.conf 文件中还有以下内容:

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 143
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}

如果我这样做,telnet localhost 143我会得到:

Trying ::1...
Connected to localhost.
Escape character is '^]'.

我不确定我是否应该得到更多。

坦白说,我不确定我的问题出在哪里,也不知道还需要检查什么。为什么我无法登录 roundcube,我还需要检查哪里才能查明我的问题?

答案1

TL;DR:您无法进行自定义端口配置,并且期望标准客户端设置能够正常工作

解释

通过设置以下配置,您已将 dovecot 配置为使用 IMAPS 协议在 IMAP 端口上进行监听:

我的 10-master.conf 文件中还有以下内容:

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 143
    ssl = yes
  }
}

=> 此块禁用明文(和 TLS 可升级)“imap”协议(端口 = 0)并启用端口 143 上强制初始 SSL/TLS 握手的“imaps”端口。

但是,端口 143 是 IANA 为 IMAP 协议分配的端口,IMAPS 应该在 993 上(/etc/services有关端口参考,请参阅)。

应该可以保留这个配置并使 dovecot 满意,但是您将需要调整所有客户端配置,因为没有人会想到这一点,IMAP 端口(143)的默认设置是允许明文通信和可选的 TLS 升级(当公布时)。

为了使 roundcube 能够正常工作,你将需要类似下面这样的东西:

$config['default_host'] = 'ssl://fqdn.of.server:143'

或者

$config['default_host'] = 'tls://fqdn.of.server:143'

这将指示 roundcube 你的 imap 服务通过标准纯文本 (143) 端口进行预加密连接。

至于telnet localhost 143你不能用它来测试 SSL 连接,你需要类似openssl s_client -servername fqdn.of.server -connect localhost:143

请注意,SSL/TLS 需要使用证书,而这些证书需要与主机名一起使用,因此您无法通过本地主机建立 SSL 连接,否则会出现一些证书问题。

建议:

虽然可以调整每个应用程序的端口,但是许多系统(防火墙、默认设置等)都依赖于为每个应用程序分配特定端口的事实。

可以使用端口 143 上的 IMAPS 与 imap 服务器协作,但您会遇到根据客户端/网络而定的各种问题。

我个人建议不要修改 dovecot 的默认操作模式,也不要删除对默认 inet 监听器配置的任何调整10-master.conf

要为 imap/pop 启用安全通信,唯一需要在默认 dovecot 配置中进行的更改就是您所做的更改10-ssl.conf(ssl = required + cert/key)。

参考:https://wiki.dovecot.org/SSL/DovecotConfiguration

此外,环回通道(localhost)上的 SSL 通信实际上并没有用,这就是为什么默认情况下,即使“ssl=required”或“disable_plaintext_auth”处于活动状态,dovecot 仍认为环回网络上的任何连接(ip 127.0.0.1 或客户端 ip 与服务器 ip 相同)即使没有 ssl/tls 也是安全的。

因此,如果你的 roundcube 服务与 dovecot 服务器位于同一主机上,则配置只需要如下:

$config['default_host'] = 'localhost'

答案2

为了使其正常工作,我必须进行以下更改:

$config['default_host'] = 'tls://localhost';

$config['default_host'] = 'imaps://localhost';

然而,我不确定它为什么会起作用,因为它似乎没有在任何地方记录。

如果它可以帮助别人,这是我的其余配置:

/etc/dovecot/conf.d/10-master.conf:

service imap-login {
  inet_listener imap {
    #port = 143
    port = 0
  }
  inet_listener imaps {
    #port = 993
    #ssl = yes
  }

}

service pop3-login {
  inet_listener pop3 {
    #port = 110
    port = 0
  }
  inet_listener pop3s {
    #port = 995
    #ssl = yes
  }
}

在我的 roundcube/config/config.inc.php 中我有:

$config['default_host'] = 'imaps://localhost';
$config['username_domain'] = '%d';


$config['imap_conn_options'] = array(
     'ssl' => array(
       'verify_peer'       => true,
       'allow_self_signed' => false,
       'ssl_cert' => '/etc/letsencrypt/live/example.com/fullchain.pem',
       'ssl_key'  => '/etc/letsencrypt/live/example.com/privkey.pem',
       'ciphers' => 'TLSv1+HIGH:!aNull:@STRENGTH',
       'peer_name'         => 'mail.example.com',
     ),
);

$config['smtp_conn_options'] = array(
     'ssl' => array(
       'verify_peer'       => true,
       'allow_self_signed' => false,
       'ssl_cert' => '/etc/letsencrypt/live/example.com/fullchain.pem',
       'ssl_key'  => '/etc/letsencrypt/live/example.com/privkey.pem',
       'ciphers' => 'TLSv1+HIGH:!aNull:@STRENGTH',
       'peer_name'         => 'mail.example.com',
     ),
);

为了帮助诊断这个问题,我还在 roundcube/config/config.inc.php 文件中启用了日志记录:

// Log successful/failed logins to <log_dir>/userlogins or to syslog
$config['log_logins'] = true;

// Log session authentication errors to <log_dir>/session or to syslog
$config['log_session'] = true;

// Log SQL queries to <log_dir>/sql or to syslog
$config['sql_debug'] = true;

// Log IMAP conversation to <log_dir>/imap or to syslog
$config['imap_debug'] = true;

// Log LDAP conversation to <log_dir>/ldap or to syslog
$config['ldap_debug'] = true;

// Log SMTP conversation to <log_dir>/smtp or to syslog
$config['smtp_debug'] = true;

日志保存在roundcube/logs安装目录中。

答案3

Roundcube 中没有“ssl_cert”或“ssl_key”之类的参数。此配置(kojow7 的)只是似乎是正确的,因为这个conf中没有“cacert”,这意味着“verify_peer”设置为false。

正确的解决方案如下(至少在Ubuntu 22.04中):

'cafile' => '/etc/ssl/certs/ISRG_Root_X1.pem',

而不是“ssl_cert”和“ssl_key”。

感谢您的关注。

相关内容