首先我要声明一下,我不是 sendmail 方面的专家。我很少使用它,但在这种情况下,我必须为我的客户使用它。
背景:
我的一个客户有一个运行 Debian 7.7、Sendmail 8.14.4 和 OpenSSL 1.0.1e 的邮件服务器。它生成电子邮件(如帐户重置)并将其发送给客户。我将其称为“服务器 A”。
由于 TLS 握手失败,从服务器 A 发送到域 *.outlook.com 上的任何邮件服务器的消息(奇怪的是,不包括 @outlook.com 消息,这些消息由 hotmail 处理)被推迟。这只是 Microsoft 拥有的服务器的问题;其他一切正常。日志中的错误如下所示:
sendmail[22213]: ruleset=tls_server, arg1=SOFTWARE, relay=mail.protection.outlook.com, reject=403 4.7.0 TLS handshake
sendmail[22213]: s2L9EakQ022098: to=<[email protected]>, 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
注意:这些日志是编造的,因为我的客户不希望复制粘贴内容,以免意外泄露敏感数据。信息就在那里,我只是手写,所以请忽略拼写错误等。
这就是我从日志中得到的全部信息,即使日志数量达到 15(超过这个数目,系统就开始受到磁盘限制)。
问题:
握手的 tcpdump 显示服务器 A 正在连接到 outlook.com,EHLO 成功,服务器 A 启动 STARTTLS,然后 outlook.com 用其证书链进行响应。所有这一切都很正常。
然后,在服务器 A 收到 Microsoft 证书链后,服务器 A 发送了自己的客户端证书。Outlook.com 随后断开了连接。
我们的客户端证书是自签名证书,用于组织内部验证,不应发送到 outlook.com。
从我有限的知识来看,我最好的猜测是 outlook.com 正在请求客户端证书进行验证(或者至少 sendmail 认为它正在请求证书),服务器 A 上的 sendmail 会照做。然后 Outlook.com 会断开连接,要么是因为证书无效,要么是因为证书不是它所期望的。
两个问题:
为什么 sendmail 将客户端证书作为 STARTTLS 的一部分发送到 outlook.com?
有没有办法可以阻止 sendmail 将客户端证书发送到我们域外的服务器,即使服务器请求它?根据我所做的实验,如果我只是忽略证书请求并发送邮件,outlook.com 将接受该邮件。
在有人提出建议之前,我已经创建了一个访问映射,阻止 TLS 与与 Microsoft 关联的某些 IP 地址进行连接。这不是一个好的永久解决方案,因为我更喜欢使用 TLS,而且必须手动维护 IP 地址列表,这很麻烦。
答案1
欢迎来到 Serverfault!:-)
您是否已明确配置 SendMail 以使用 TLS?如果没有,SendMail 仍会尝试使用零字节客户端证书执行机会性 TLS 操作。我猜这就是您所看到的?有关此问题的更多信息(奇怪之处?),请查看 @MadHatter 在此处的精彩回复:https://serverfault.com/a/514180/21875
因此,我将按照提问的顺序回答您的问题:
- 为什么 sendmail 将客户端证书作为 STARTTLS 的一部分发送到 outlook.com?
当两个 MTA 尝试为 STARTTLS 建立安全隧道时,它们通常会协商安全信息并交换公共证书,以便彼此安全地加密信息。如果 sendmail 没有向 outlook.com 提供客户端证书,outlook.com 邮件服务器就无法将响应/确认加密回 sendmail。
- 有没有办法可以阻止 sendmail 将客户端证书发送到我们域外的服务器,即使服务器请求它?根据我所做的实验,如果我只是忽略证书请求并发送邮件,outlook.com 将接受该邮件。
您有以下几种选择:
选项#1:实施每个服务器/每个域的例外规则。 这可以通过添加Try_TLS:<broken.server> NO
到您的访问表来完成。听起来你已经这样做了,但需要注意的是,“broken.server”部分可以是 IP、MX 记录(microsoft-com.mail.protection.outlook.com)或部分的MX 记录(outlook.com)。
选项#2:为所有域实施旁路规则。 这可以通过添加到您的访问表来完成Try_TLS: NO
(无需指定 IP)。
技术上,您还可以破解 sendmail.mc 文件,以完全阻止 sendmail 检查 TLS 功能。但我不建议这样做,因为它需要进行细微的更改。
答案2
转移解决方案问题前往回答部分。
对于那些遇到此问题并且无法解决的人,我找到了根本原因和解决方案。
我无法阻止客户端证书发送到 Microsoft,因此我唯一的选择就是找出 Microsoft 拒绝服务器的原因。创建证书时,我们使用的服务器名称与 ehlo 中显示的名称不同。例如,mx1.example.com
在 helo 和mx.example.com
证书中。不匹配导致 Microsoft 在没有解释的情况下断开连接。