Roundcube 和 Postfix SMTP:SSL 例程:SSL3_READ_BYTES:tlsv1 警报未知 ca:s3_pkt.c

Roundcube 和 Postfix SMTP:SSL 例程:SSL3_READ_BYTES:tlsv1 警报未知 ca:s3_pkt.c

我有一套 Postfix / Dovecot / Roundcube 设置,供个人使用,也提供给其他用户。我试图将整个设置转移到新机器上,但遇到了一些问题。

邮件接收工作正常(仅内部测试,域名尚未转移),并且外部 IMAP 和 SMTP 使用 TLS/SSL 工作正常(例如 Thunderbird)

问题出在我的 roundcube 设置上,它可以使用 IMAP 到 127.0.0.1,并且可以很好地显示用户的电子邮件,但无法发送电子邮件,只是声称: "SMTP Error (220): Authentication failed."

奇怪的是,使用与当前服务器相同的 Postfix/Dovecot 配置,Roundcube 无法在新服务器上访问它。以下是相关的 roundcube 配置:

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

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

// SMTP port (default is 25; use 587 for STARTTLS or 465 for the
// deprecated SSL over SMTP (aka SMTPS))
$config['smtp_port'] = 587;

// SMTP username (if required) if you use %u as the username Roundcube
// will use the current username for login
$config['smtp_user'] = '%u';

// SMTP password (if required) if you use %p as the password Roundcube
// will use the current user's password for login
$config['smtp_pass'] = '%p';

Roundcube 的日志/错误日志简单地说:

[02-Jan-2015 16:55:49 America/New_York] STARTTLS failed (): 
[02-Jan-2015 16:55:49 -0500]: SMTP Error: SMTP error: Authentication failure: STARTTLS failed (Code: ) in /var/wwwmail/program/lib/Roundcube/rcube.php on line 1505 (POST /?_task=mail&_unlock=loading1420235752730&_lang=undefined&_framed=1?_task=mail&_action=send)

而Roundcube的logs/smtp日志显示:

[02-Jan-2015 17:50:01 -0500]: Recv: 220 example.net ESMTP Postfix
[02-Jan-2015 17:50:01 -0500]: Send: EHLO example.net
[02-Jan-2015 17:50:01 -0500]: Recv: 250-example.net
[02-Jan-2015 17:50:01 -0500]: Recv: 250-PIPELINING
[02-Jan-2015 17:50:01 -0500]: Recv: 250-SIZE 104857600
[02-Jan-2015 17:50:01 -0500]: Recv: 250-VRFY
[02-Jan-2015 17:50:01 -0500]: Recv: 250-ETRN
[02-Jan-2015 17:50:01 -0500]: Recv: 250-STARTTLS
[02-Jan-2015 17:50:01 -0500]: Recv: 250-ENHANCEDSTATUSCODES
[02-Jan-2015 17:50:01 -0500]: Recv: 250-8BITMIME
[02-Jan-2015 17:50:01 -0500]: Recv: 250 DSN
[02-Jan-2015 17:50:01 -0500]: Send: STARTTLS
[02-Jan-2015 17:50:01 -0500]: Recv: 220 2.0.0 Ready to start TLS
[02-Jan-2015 17:50:01 -0500]: Send: RSET
[02-Jan-2015 17:50:01 -0500]: Recv: M I A…"qhçR¸
[02-Jan-2015 17:50:01 -0500]: Send: QUIT

以下是来自 /etc/postfix/main.cf 的我的 postfix 配置的相关片段

# TLS parameters for SMTP service
smtpd_tls_security_level    = may
smtpd_tls_cert_file         = /etc/ssl/private/example.net/example.net.crt
smtpd_tls_key_file          = /etc/ssl/private/example.net/example.net.key
smtpd_tls_auth_only         = yes

以下是来自 /etc/postfix/master.cf 的我的 postfix 配置的相关片段

smtp      inet  n       -       -       -       -       smtpd
  -o content_filter=spamassassin
submission inet  n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o cleanup_service_name=cleanup_submit
smtps     inet  n       -       -       -       -       smtpd
  -o content_filter=spamassassin
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

Postfix日志/var/log/mail.log报告以下错误:

Jan  2 17:50:01 example postfix/submission/smtpd[19959]: connect from localhost.localdomain[127.0.0.1]
Jan  2 17:50:01 example postfix/submission/smtpd[19959]: SSL_accept error from localhost.localdomain[127.0.0.1]: 0
Jan  2 17:50:01 example postfix/submission/smtpd[19959]: warning: TLS library problem: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c:1292:SSL alert number 48:
Jan  2 17:50:01 example postfix/submission/smtpd[19959]: lost connection after STARTTLS from localhost.localdomain[127.0.0.1]
Jan  2 17:50:01 example postfix/submission/smtpd[19959]: disconnect from localhost.localdomain[127.0.0.1]

我读过其他几个有类似错误代码的问题,但它们似乎都使用自签名证书,或者从 /etc/ssl/certs/ 添加到证书哈希的链接,我已经尝试过了,虽然我可能误解了,并且链接了错误的证书。

Roundcube 已更新至 1.0.4,旨在修复因 openssl 导致的 php 版本不兼容问题。我完全没有主意了,有人有什么想法吗?

答案1

上面的错误消息看起来像一个客户端(roundcube 调用的 PHP 脚本)由于未知 CA,无法验证对等证书. 发生此错误的原因有很多。

关于 openssl,Roundcube 1.0-RC 及更高版本附带了 SSL 连接选项。参数smtp_conn_optionsimap_conn_options分别在 1.0-RC 和 1.0.3 版本中添加。默认情况下,这两个参数的值都是空的。以下代码片段取自 roundcube 文件config/defaults.inc.php。您可以参考PHP 手册获取此参数的完整描述。

// SMTP socket context options
// See http://php.net/manual/en/context.ssl.php
// The example below enables server certificate validation, and
// requires 'smtp_timeout' to be non zero.
// $config['smtp_conn_options'] = array(
//   'ssl'         => array(
//     'verify_peer'  => true,
//     'verify_depth' => 3,
//     'cafile'       => '/etc/openssl/certs/ca.crt',
//   ),
// );
$config['smtp_conn_options'] = null;

在许多使用自签名证书的系统中,默认值适用于 PHP 5.5 及更早版本。默认情况下,PHP 5.6 将根据已安装的 CA 验证对等证书并验证对等名称

现在,看起来 Debian jessie 也默认搭载 PHP 5.6 版本。显然 PHP 无法验证 postfix 证书。可能的原因是,PHP 在 verify_peer_name 中失败(因为您在 hostname 中指定了 localhost)或在 verify_peer 中失败(因为 CA 未知)


类似情况也发生过致 Arch Linux 用户解决方案是:

  • 在 openssl cert 目录中安装 CA 证书
  • 在 roundcube smtp_server 选项中,将 localhost 更改为 Postfix FQDN (来自 OP 的解决方案)
  • 在 smtp_conn_options 中禁用 verify_peer 和/或 verify_peer_name

答案2

PHP 5.6 执行 SSL 对等验证,这意味着它会检查 SMTP 服务器的证书是否是已知的 CA。

smtp_server 选项必须与证书的 CN 字段匹配!(通用名称)

因此,不要将 localhost 放入其中,而应将与您的证书匹配的完整合格域名放入其中。

致谢:https://www.blogobramje.nl/posts/Roundcube_sending_mail_broken_with_PHP_5.6_-_STARTTLS_failed/

答案3

因为我使用 dovecot,所以我的解决方案是将 ca 添加到/etc/dovecot/dovecot.conf

ssl_ca = </etc/ssl/ca.pem

答案4

同样的问题!快速解决一个棘手的问题:将 config/defaults.inc.php 中的 verify_peer 更改为 false。

$config['smtp_conn_options'] = array(
   'ssl'         => array(
     'verify_peer'  => false,
     'verify_depth' => 3,
     'cafile'       => '/etc/openssl/certs/ca.crt',
   ),
);

警告仅适用于测试;不适用于生产环境

相关内容