我正在尝试让 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”。
感谢您的关注。