尝试使用 POSTFIX 保护 SMTP 时在端口 25 上提供证书

尝试使用 POSTFIX 保护 SMTP 时在端口 25 上提供证书

背景

我认为我的 POSTFIX 设置已接近我所期望的水平。我运行了一些 SMTP 在线检查,我的 SMTP 通过了所有基本的安全测试。

我在 Thunderbird 中收到证书警告。我使用的是临时自签名证书,所以我知道为什么会出现证书异常。这不是我的问题。

目标

我想禁用 SMTP 服务器上任何未加密和未经身份验证的邮件发送。我只想使用 TLS。

问题

我不确定我是否有问题,但是当我连接 Thunderbird 时,我收到有关证书的警告端口 25。无论我使用哪种连接安全性或端口,我都会收到此警告。我已在端口 465 上尝试了 SSL/TLS,在 587 上尝试了 STARTTLS,在端口 25 上没有尝试。我希望证书位于端口 465 或 587 上。

另一个让我感到困惑的是,为什么我仍然可以设置 Thunderbird 使用没有安全性的端口 25,并且这个安全异常在发送时仍然会出现。

发送这封电子邮件仍然加密吗?
我是否遇到了我不知道的问题? 我怎样才能让我的服务器在端口 465 上响应?

postfix/master.cf

smtp      inet  n       -       -       -       -       smtpd
  -o smtpd_tls_auth_only=yes
  -o smtp_sasl_auth_enable=no
  -o smtp_tls_security_level=none

# SMTP with TLS on port 587. Currently commented.
submission inet n       -       -       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_enforce_tls=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
  -o smtpd_sasl_tls_security_options=noanonymous
  -o smtpd_sasl_security_options=noanonymous,noplaintext

# SMTP over SSL on port 465.
smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
  -o smtpd_sasl_security_options=noanonymous,noplaintext
  -o smtpd_sasl_tls_security_options=noanonymous

后配置-n

append_dot_mydomain = no
biff = no
broken_sasl_auth_clients = yes
config_directory = /etc/postfix
content_filter = amavis:[127.0.0.1]:10024
disable_vrfy_command = yes
dovecot_destination_recipient_limit = 1
enable_original_recipient = no
header_checks = regexp:/etc/postfix/header_checks
inet_interfaces = all
mailbox_size_limit = 0
maximal_backoff_time = 8000s
maximal_queue_lifetime = 7d
minimal_backoff_time = 1000s
mydestination =
myhostname = localbark.info
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mynetworks_style = host
myorigin = /etc/hostname
queue_directory = /var/spool/postfix
readme_directory = no
recipient_delimiter = +
smtp_helo_timeout = 60s
smtp_sasl_security_options = noplaintext, noanonymous
smtp_tls_note_starttls_offer = yes
smtp_tls_security_level = may
smtpd_banner = $myhostname ESMTP $mail_name
smtpd_client_restrictions = reject_rbl_client sbl.spamhaus.org, reject_rbl_client blackholes.easynet.nl, reject_rbl_client dnsbl.njabl.org
smtpd_data_restrictions = reject_unauth_pipelining
smtpd_delay_reject = yes
smtpd_hard_error_limit = 12
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_hostname, reject_invalid_hostname, permit
smtpd_recipient_limit = 16
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023, permit
smtpd_relay_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023, permit
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks, warn_if_reject reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_pipelining, permit
smtpd_soft_error_limit = 3
smtpd_tls_CAfile = /rootCA.pem
smtpd_tls_cert_file = /device.crt
smtpd_tls_key_file = /device.key
smtpd_tls_loglevel = 3
smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3
smtpd_tls_received_header = yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
unknown_local_recipient_reject_code = 450
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_domainaliases_maps.cf
virtual_gid_maps = static:8
virtual_mailbox_base = /var/vmail
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf, mysql:/etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf
virtual_transport = dovecot
virtual_uid_maps = static:150

2015 年 1 月 27 日更新

我的邮件服务器正在使用 STARTTLS,但仅在端口 25 上使用。并且邮件在端口 25 上成功发送。当我尝试在 587 上使用 STARTTLS 时,我的邮件客户端 (Thunderbird) 超时。以下是 mail.log 文件中的内容

Jan 27 11:55:21 mail2 postfix/submission/smtpd[2229]: initializing the server-side TLS engine
Jan 27 11:55:22 mail2 postfix/submission/smtpd[2229]: warning: hostname XXXXXXX.com does not resolve to address XX.XX.XX.XX: Name or service not known
Jan 27 11:55:22 mail2 postfix/submission/smtpd[2229]: connect from unknown[XX.XXX.XX.XX]
Jan 27 11:55:22 mail2 postfix/submission/smtpd[2229]: setting up TLS connection from unknown[XX.XXX.XX.XX]
Jan 27 11:55:22 mail2 postfix/submission/smtpd[2229]: unknown[XX.XXX.XX.XX]: TLS cipher list "aNULL:-aNULL:ALL:!EXPORT:!LOW:+RC4:@STRENGTH"
Jan 27 11:55:22 mail2 postfix/submission/smtpd[2229]: SSL_accept:before/accept initialization
Jan 27 11:55:22 mail2 postfix/submission/smtpd[2229]: read from 7F3F40B73C60 [7F3F40B86E70] (11 bytes => -1 (0xFFFFFFFFFFFFFFFF))
Jan 27 11:57:11 mail2 postfix/submission/smtpd[2229]: read from 7F3F40B73C60 [7F3F40B86E70] (11 bytes => 0 (0x0))
Jan 27 11:57:11 mail2 postfix/submission/smtpd[2229]: SSL_accept error from unknown[XX.XXX.XX.XX]: lost connection
Jan 27 11:57:11 mail2 postfix/submission/smtpd[2229]: lost connection after CONNECT from unknown[XX.XXX.XX.XX]
Jan 27 11:57:11 mail2 postfix/submission/smtpd[2229]: disconnect from unknown[XX.XXX.XX.XX]

以下是远程计算机通过 telnet 访问 587 时得到的结果

telnet mail.example.com 587
Trying xxx.xxx.xxx.xx...
Connected to mail.example.com.
Escape character is '^]'.
ehlo testing
Connection closed by foreign host.

答案1

好吧,看起来你把 SMTPD 与 SMTP 混淆了。从后缀的角度来看,这两个东西有不同的用途。SMTPsmtpd服务器用于接收电子邮件,它绑定到特定端口(例如 25、587、465)。SMTPsmtp客户端用于发送电子邮件,它连接到 SMTP 服务器端口。

这里的另一个混淆是关于 STARTTLS、SMTPS 和未加密电子邮件。默认情况下,postfix 将发送和接收未加密的电子邮件。对于加密方法,SMTP 有两种模式:STARTTLS 和 SMTPS。使用 STARTTLS,客户端将以未加密的形式启动连接,然后稍后将其升级为加密形式。现在 SMTP 的 SMTPS 就像 HTTP 的 HTTPS。与 STARTTLS 不同,客户端将通过 TLS 协商启动连接,然后在顶部 TLS 上启动 SMTP 闲聊。通常具有 STARTTLS 功能的 smtpd 在端口 587 上监听,STMPS 在端口 465 上监听。有关其他参考,请参阅此 SO 问题:465端口和587端口有什么区别?

现在,我们将讨论 postfix。默认情况下,postfix 中的每个进程都将从中获取配置main.cf(您可以通过上述方式查看更改postconf -n)。当然,您可以通过覆盖每个 postfix 服务,master.cf就像您对不同端口的三个 smtpd 进程所做的那样。在这种情况下,您想要覆盖该选项,因此

  • 端口 25 (smtp) 不应向您发出证书警告,也不应提供 STARTTLS
  • 端口 587(提交)应提供 STARTTLS 并向您发出证书警告
  • 端口 465 (smtps) 应与 SMTPS 通信并向您发出证书警告

要关闭端口 25 中的证书警告,只需smtpd_tls_security_level = none指定

smtp      inet  n       -       -       -       -       smtpd
  -o smtpd_tls_auth_only=yes
  -o smtpd_sasl_auth_enable=no
  -o smtpd_tls_security_level=none

您会注意到,我将smtp_参数替换为smtpd_。请参阅官方文档smtpd_tls_security_level

要为端口 465 启用 SMTPS,请使用参数smtpd_tls_wrappermode = yes。上面的配置看起来没问题。

现在,因为我们需要在端口 587 上使用 STARTTLS(而不是 SMTPS),所以您不需要smtpd_tls_wrappermode = yes在提交服务中指定。将其删除。

连接到端口 587 时出现的错误就是由此引起的smtpd_tls_wrapper模式参数。Postfix 希望您使用加密流量进行通信,并以纯文本形式指定命令。

答案2

该参数-o smtpd_tls_wrappermode=yes导致邮件服务器不响应协议sumission。我刚从 master.cf 中删除该参数,EHLO 就收到了对端口 587 上的 telnet 的响应,Thunderbird 邮件客户端成功将邮件发送到端口 587 而不是 25。因此,下面是我的 master.cf 提交 (TLS) 协议代码片段:

submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_enforce_tls=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
  -o smtpd_sasl_tls_security_options=noanonymous
  -o smtpd_sasl_security_options=noanonymous,noplaintext
#  -o smtpd_tls_wrappermode=yes # This one was the issue*****

我想知道我是否只是盲目地看不到导致问题的原因。我没有在 postfix 文档中或在 serverfault.com、Google 等网站上的任何搜索中看到任何参考。

希望这能在未来帮助到一些不幸的可怜人。:-)

答案3

除了 postfix 配置之外,你还应该使用类似的工具https://www.wireshark.org/检查传输过程中到底发生了什么。您还应该看到 STARTTLS 和(未)加密的流量。

相关内容