Php

Roundcube & Postfix SMTP:SSL 常式:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c

  • April 24, 2017

我有一個我個人使用的 Postfix / Dovecot / Roundcube 設置,也提供給其他使用者。我正在嘗試將整個設置轉移到一個新盒子,但有一些問題。

郵件接收工作正常,(僅在內部測試,域尚未轉移。)以及使用 TLS/SSL 的外部 IMAP 和 SMTP 工作良好(例如,Thunderbird)

問題在於我的roundcube設置,它可以使用IMAP到127.0.0.1,並且可以很好地顯示使用者的電子郵件,但不能發送電子郵件,只是聲稱: "SMTP Error (220): Authentication failed."

奇怪的是,使用我在目前伺服器上使用的相同 Postfix/Dovecot 配置,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 的日誌/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 的我的後綴配置的相關片段

# 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 的我的後綴配置的相關片段

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 版本不兼容問題。我完全沒有想法,有人有任何想法嗎?

上面的錯誤消息看起來像客戶端(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 無法驗證後綴證書。可能的原因,PHP 在 verify_peer_name 中失敗(因為您在主機名中指定了 localhost)或在 verify_peer 中(因為 CA 未知)


Arch Linux 使用者也發生了類似的情況。解決方案是:

  • 在 openssl cert 目錄中安裝 CA 證書
  • 在 roundcube smtp_server 選項中,將 localhost 更改為 Postfix FQDN(來自 OP 的解決方案)
  • 在 smtp_conn_options 中禁用 verify_peer 和/或 verify_peer_name

引用自:https://serverfault.com/questions/655995