如何在 Exim 中强制执行 STARTTLS?

如何在 Exim 中强制执行 STARTTLS?

我正在学习设置邮件服务器。我使用 postfix 让它工作,现在尝试使用 Exim 进行相同的配置。如何强制客户端仅占用 STARTTLS 连接进行 SMTP 传出连接?我按照此问题中的说明进行操作。

在 exim 中发送电子邮件需要 STARTTLS

我的配置现在如下所示

MAIN_TLS_ENABLE = yes
MAIN_TLS_CERTIFICATE = /etc/ssl/certs/ssl-cert-snakeoil.pem
MAIN_TLS_PRIVATEKEY = /etc/ssl/private/ssl-cert-snakeoil.key

.ifdef MAIN_TLS_ENABLE
# Defines what hosts to 'advertise' STARTTLS functionality to. The
# default, *, will advertise to all hosts that connect with EHLO.
.ifndef MAIN_TLS_ADVERTISE_HOSTS
MAIN_TLS_ADVERTISE_HOSTS = *
.endif
tls_advertise_hosts = MAIN_TLS_ADVERTISE_HOSTS

auth_advertise_hosts = ${if eq{$tls_in_cipher}{}{}{*}}

重启 Exim,没有错误。然后我运行了一些测试http://checktls.com/

TestSender 通过了,我可以在安全通信下发送电子邮件。但 TestSenderAssureTLS 失败了,网站可以协商未加密的通信。

我错过了什么?

当我使用 Thunderbird 创建帐户时,它会自动检测不安全的 SMTP 通道,而不是使用 STARTTLS 的通道。设置帐户并发送电子邮件成功。但是,当我从网络中计算机的 shell 进行 SMTP 对话时,没有公布任何身份验证。它看起来如下:

EHLO <subdomain>.<domain>
250-betelgeuse Hello <subdomain>.<domain> [10.0.14.34]
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250-STARTTLS
250 HELP
AUTH LOGIN
503 AUTH command used when not advertised

有人能指出我遗漏了什么吗?我该如何做更好的测试?在相关主题上,我该如何向执行 autdetect 的客户端通告我想要的配置?谢谢。

答案1

连接STARTTLS需要以不安全的方式启动。该STARTTLS选项直到第一个EHLO命令之后才会公布。如果您想强制执行STARTTLS,则需要添加或修改ACL。我发布了电子邮件政策 我申请

如果此服务器是您的 MX,则不应强制执行STARTTLS所有连接。我的配置要求STARTTLS需要的连接AUTH。这不包括来自我的 LAN 的连接,但适用于漫游时从我的服务器发送电子邮件的用户。我还要求在提交端口上进行身份验证。这是我ACL使用的基础知识。

# This access control list is used after an auth command.
acl_local_auth:

# Deny authentication on unencrypted links
deny
  !encrypted = *
  message = AUTH encryption is required

# Deny if AUTH isn't on submission port (autolist enabled)
deny
   !condition = ${if eq {$interface_port}{587}}
   message = AUTH requires submission port

# Accept if encrypted (should not get here if unencrypted)
accept
  encrypted = *

# 默认拒绝拒绝消息 = AUTH 不被接受

您还可以TLS在邮件中强制执行ACL。此 ACL 允许外部发件人发送邮件。

# This access control list is used for every MAIL FROM command in an
# incoming SMTP message. 
acl_local_mail_from:

# Accept if locally trusted hosts
accept
  hosts = : +relay_from_hosts

# Accept if authenticated
## May want to check domain is local
accept
  authenticated = *

# Accept the null sender - bounce messages and receipts
accept
  senders = :

# Accept if not local domain - recipient ACL will handle relaying
# More checks on sender in recipient ACL.
accept
  !hosts = : +relay_from_hosts
  !sender_domains = +local_domains

# Default deny
deny
  message = $sender_address is not authorized to send email on this connection.

在测试 ACL 时,您应该考虑使用defer而不是。通过将语句添加到配置的主要部分并将上述 ACL 添加到 ACL 部分来deny启用 ACL 。acl

acl_smtp_auth = acl_local_auth acl_smtp_mail = acl_local_mail_from

答案2

根据您的设置...

tls_advertise_hosts = MAIN_TLS_ADVERTISE_HOSTS
auth_advertise_hosts = ${if eq{$tls_in_cipher}{}{}{*}}

您需要 TLS 连接来宣传身份验证,因此使用 openssl 启动连接:

openssl s_client -connect hostname:25 -starttls smtp

相关内容