后缀TLS错误

我正在使用Postfix / Dovecot / Roundcube安装程序,目标是可以通过Internet发送邮件的虚拟用户邮件系统,如此处所述。

一切似乎运作良好; 鸽舍显示没有问题,我可以telnet到我的所有港口; 然而,每当我尝试通过Roundcube发送邮件,我得到的错误:

SMTP Error (220): Authentication failed. 

而从日志:

 [17-Jan-2015 05:27:31 +0000]: SMTP Error: SMTP error: Authentication failure: STARTTLS failed (Code: ) in /usr/share/webapps/roundcubemail/program/lib/Roundcube/rcube.php on line 1505 (POST /roundcube/?_task=mail&_unlock=loading1421472451594&_lang=en_US&_framed=1?_task=mail&_action=send) 

自从Postfix负责SMTP之后,我觉得它一定是罪魁祸首。 在我的Postfix日志中,我看到:

 Jan 16 21:14:35 steelhorse postfix/smtpd[18426]: disconnect from localhost.localdomain[127.0.0.1] Jan 16 21:14:35 steelhorse postfix/smtpd[18426]: lost connection after STARTTLS from localhost.localdomain[127.0.0.1] Jan 16 21:14:35 steelhorse postfix/smtpd[18426]: warning: TLS library problem: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c:1293:SSL alert number Jan 16 21:14:35 steelhorse postfix/smtpd[18426]: SSL_accept error from localhost.localdomain[127.0.0.1]: 0 

我的SSL证书是用CN作为CN签名的,因为这解决了我遇到的另一个问题。 Postfix设置$ myhostname参数是邮件。[mydomain]并且使用Afraid DynDNS我为mail.mydomain设置了一个Alogging以及一个像1:mail。[mydomain]那样的MXlogging。 我试图设置这些都只是[mydomain],它不工作。 一个telnet会话如下所示:

 telnet [mydomain] 587 Trying [myip]... Connected to [mydomain]. Escape character is '^]'. 220 [mydomain] ESMTP Postfix ehlo [mydomain] 250-[mydomain] 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN 

我的Postfix main.cf(不包括大部分的默认行):

 #soft_bounce = no queue_directory = /var/spool/postfix command_directory = /usr/bin daemon_directory = /usr/lib/postfix data_directory = /var/lib/postfix mail_owner = postfix #default_privs = nobody myhostname = [mydomain] #myhostname = virtual.domain.tld mydomain = [mydomain] #myorigin = $myhostname myorigin = $mydomain #inet_interfaces = all #inet_interfaces = $myhostname #inet_interfaces = $myhostname, localhost #proxy_interfaces = #proxy_interfaces = 1.2.3.4 #mydestination = $myhostname, localhost.$mydomain, localhost ... #local_recipient_maps = unix:passwd.byname $alias_maps unknown_local_recipient_reject_code = 550 #mynetworks_style = class #mynetworks_style = subnet mynetworks_style = host #mynetworks = 168.100.189.0/28, 127.0.0.0/8 #mynetworks = $config_directory/mynetworks #mynetworks = hash:/etc/postfix/network_table #relay_domains = $mydestination #relayhost = $mydomain ... relay_domains = * virtual_alias_maps = proxy:mysql:/etc/postfix/virtual_alias_maps.cf virtual_mailbox_domains = proxy:mysql:/etc/postfix/virtual_mailbox_domains.cf virtual_mailbox_maps = proxy:mysql:/etc/postfix/virtual_mailbox_maps.cf virtual_mailbox_base = /home/vmail virtual_mailbox_limit = 512000000 virtual_minimum_uid = 5000 virtual_transport = virtual virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 local_transport = virtual local_recipient_maps = $virtual_mailbox_maps transport_maps = hash:/etc/postfix/transport smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = /var/run/dovecot/auth-client smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_sasl_security_options = noanonymous smtpd_sasl_tls_security_options = $smtpd_sasl_security_options smtpd_tls_auth_only = yes smtpd_tls_cert_file = /etc/ssl/private/server.crt smtpd_tls_key_file = /etc/ssl/private/server.key smtpd_sasl_local_domain = $mydomain broken_sasl_auth_clients = yes smtpd_tls_loglevel = 1 

我也试着将Roundcube的smtp_conn_options设置为null。 我真的不确定问题出在DNSlogging,SSL证书还是什么。 任何和所有的帮助,将不胜感激!

UPDATE

将我的Roundcube conf.inc.php设置为verify_peer(_name)= false后

 /* Local configuration for Roundcube Webmail */ $config['db_dsnw'] = 'mysql://roundcube_user:steelcube@localhost/roundcube_db'; $config['default_host'] = 'ssl://localhost/'; $config['default_port'] = 993; $config['smtp_server'] = 'tls://localhost/'; $config['smtp_user'] = '%u'; $config['smtp_pass'] = '%p'; $config['smtp_auth_type'] = 'LOGIN'; $config['smtp_conn_options'] = null; $config['imap_conn_options'] = array( 'ssl' => array( 'verify_peer' => false, 'verfify_peer_name' => false, ), ); $config['smtp_conn_options'] = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, ), ); $config['smtp_port'] = 587; $config['support_url'] = ''; $config['des_key'] = '[secret]'; $config['plugins'] = array('archive', 'zipdownload'); $config['mime_types'] = '/etc/httpd/conf/mime.types'; 

这给了我新的错误SMTP Error (535): Authentication failed发送电子邮件时SMTP Error (535): Authentication failed 。 这里的roundcube错误的内容

 [18-Jan-2015 02:58:06 UTC] PHP Deprecated: Non-static method PEAR::raiseError() should not be called statically, assuming $this from incompatible context in /usr/share/webapps/roundcubemail/program/lib/Net/SMTP.php on line 371 [18-Jan-2015 02:58:06 UTC] PHP Deprecated: Non-static method PEAR::raiseError() should not be called statically, assuming $this from incompatible context in /usr/share/webapps//roundcubemail/program/lib/Net/SMTP.php on line 371 [18-Jan-2015 02:58:06 +0000]: SMTP Error: SMTP error: Failed to set sender /roundcubemail/program/lib/Net/SMTP.php on line 371'[username]@[mydomain]' in /usr/share/webapps/roundcubemail/program/lib/Roundcube/rcube.php on line 1505 (POST /roundcube/?_task=mail&_unlock=loading1421549886598&_lang=en_US&_framed=1?_task=mail&_action=send) 

和maillog入口

 Jan 18 20:18:21 steelhorse postfix/smtpd[1942]: connect from localhost.localdomain[127.0.0.1] Jan 18 20:18:21 steelhorse postfix/smtpd[1942]: Anonymous TLS connection established from localhost.localdomain[127.0.0.1]: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128 Jan 18 20:18:21 steelhorse postfix/smtpd[1942]: warning: localhost.localdomain[127.0.0.1]: SASL LOGIN authentication failed: Invalid authentication mechanism Jan 18 20:18:21 steelhorse postfix/smtpd[1942]: disconnect from localhost.localdomain[127.0.0.1] 

根据聊天请求,这是dovecot -a | grep auth_mechanism的输出 dovecot -a | grep auth_mechanism

 auth_mechanisms = plain 

OK看起来像你的后缀,roundcube和dovecotconfiguration有太多的不匹配。 让我们一个一个的分解。

STARTTLS错误

这个日志行

 warning: TLS library problem: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c:1293:SSL alert number 

表示由于未知的CA,PHP无法validation对等证书。 这是完全重复的问题: Roundcube&Postfix SMTP:SSL例程:SSL3_READ_BYTES:tlsv1警报未知ca:s3_pkt.c 。 从这个问题你已经解决了在roundcube中添加这些行

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

validation失败错误

为此,我们必须查看postfix和roundcube日志来识别问题。 真正的消息是在后缀日志文件中捕获的

 Jan 18 20:18:21 steelhorse postfix/smtpd[1942]: warning: localhost.localdomain[127.0.0.1]: SASL LOGIN authentication failed: Invalid authentication mechanism 

现在因为后缀SASL机制是由dovecot提供的,那么你应该检查dovecot提供的机制dovecot -a | grep auth_mechanism dovecot -a | grep auth_mechanism

通过查看$config['smtp_auth_type']和dovecot auth_mechanismsconfiguration,可以看到这两者之间不匹配。 鸽舍只提供PLAIN机制。 但是roundcube被configuration为使用LOGIN机制。

解决scheme可以是其中的一个或两个

  • 通过添加从dovecot侧提供LOGIN机制

     auth_mechanisms = plain login 

    在dovecotconfiguration。

  • 通过更改参数将PLAINlogin设置为圆形方

     $config['smtp_auth_type'] = 'PLAIN';