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