使用 TLS 时 Microsoft 拒绝的 Sendmail 消息

Eri*_*c J 6 sendmail openssl

我将首先声明我不是 sendmail 方面的专家。我很少使用它,但在这种情况下,我必须为我的客户使用。

背景:

我的一个客户端有一个运行 Debian 7.7、Sendmail 8.14.4 和 OpenSSL 1.0.1e 的邮件服务器。它生成电子邮件(诸如帐户重置之类的内容)并将其发送给客户。我将其称为“服务器 A”。

由于 TLS 握手失败,从服务器 A 发送到域 *.outlook.com 中的任何邮件服务器的邮件(奇怪的是不包括 @outlook.com 邮件,这些邮件由 hotmail 处理)被推迟。这只是微软拥有的服务器的问题;其他一切都在工作。日志中的错误类似于:

sendmail[22213]: ruleset=tls_server, arg1=SOFTWARE, relay=mail.protection.outlook.com, reject=403 4.7.0 TLS handshake

sendmail[22213]: s2L9EakQ022098: to=<blah@microsoft.com>, delay=00:00:55, xdelay=00:00:31, mailer=esmtp, pri=181653, relay=mail.protection.outlook.com. [145.123.225.25], dsn=4.0.0, stat=Deferred
Run Code Online (Sandbox Code Playgroud)

注意:这些日志是编造的,因为我的客户不希望复制和粘贴内容,以免意外泄漏敏感数据。信息就在那里,我只是手动输入,所以忽略错别字等。

这就是我可以从日志中获得的全部信息,即使日志是 15(除此之外,系统开始成为磁盘绑定)。

问题:

握手的 tcpdump 显示服务器 A 正在连接到 Outlook.com,EHLO 成功,服务器 A 启动了 STARTTLS,然后 Outlook.com 以其证书链响应。所有这一切都很正常。

然后在服务器 A 收到微软证书链后,服务器 A 发送了自己的客户端证书。Outlook.com 然后断开了连接。

我们的客户端证书是我们用于组织内部验证的自签名证书,不应发布到 Outlook.com。

根据我有限的知识,我最好的猜测是,outlook.com 正在请求客户端证书进行验证(或者至少 sendmail 认为它请求证书),服务器 A 上的 sendmail 是有义务的。Outlook.com 然后断开连接,要么是因为证书无效,要么不是它所期望的。

两个问题:

  1. 为什么 sendmail 将客户端证书作为 STARTTLS 的一部分发送到 Outlook.com?

  2. 有没有办法阻止 sendmail 将客户端证书发送到我们域外的服务器,即使服务器请求它?根据我所做的实验,如果我只是忽略证书请求并发送消息,outlook.com 将接受该消息。

在任何人提出建议之前,我已经创建了一个访问映射,以防止 TLS 与与 Microsoft 关联的某些 IP 地址进行连接。这不是一个好的永久解决方案,因为我更喜欢使用 TLS,并且必须手动维护 IP 地址列表,这很麻烦。

Mik*_*e B 3

欢迎来到服务器故障!:-)

您是否明确配置 SendMail 以使用 TLS?如果没有,SendMail 仍会立即尝试使用零字节客户端证书执行机会性 TLS 操作。我想这就是你所看到的?有关此问题的更多信息(奇怪?)请查看@MadHatter 的精彩回复:https://serverfault.com/a/514180/21875

因此,话虽如此,我将按照您提出的问题的顺序回答您的问题:

  1. 为什么 sendmail 将客户端证书作为 STARTTLS 的一部分发送到 Outlook.com?

当两个 MTA 尝试为 STARTTLS 建立安全隧道时,它们通常会协商安全信息并交换公共证书,以便可以安全地相互加密信息。如果 sendmail 未向 Outlook.com 提供客户端证书,则 Outlook.com 邮件服务器将无法加密发回 sendmail 的响应/确认。

  1. 有没有一种方法可以阻止 sendmail 将客户端证书发送到我们域之外的服务器,即使服务器请求它?根据我所做的实验,如果我只是忽略证书请求并发送消息,outlook.com 将接受该消息。

您有几个选择:

选项#1:实施每个服务器/每个域的例外规则。Try_TLS:<broken.server> NO这可以通过添加到访问表 来完成。听起来您已经在这样做了,但需要注意的是,“broken.server”部分可以是 IP、MX 记录 (microsoft-com.mail.protection.outlook.com) 或部分MX 记录 (outlook.com)。 com)。

选项#2:对所有域实施绕过规则。 这可以通过添加到访问表来完成Try_TLS: NO(无需指定 IP)。

从技术上讲,您还可以破解 sendmail.mc 文件以阻止 sendmail 检查 TLS 功能。但我不建议这样做,因为它需要微妙的改变。