在使用TLS时拒收Microsoft的Sendmail邮件

我将以一个声明说,我不是sendmail的专家。 我很less使用它,但在这种情况下,我必须为我的客户。

背景:

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

从服务器A发送到域* .outlook.com(奇怪不包括@ outlook.com消息,由hotmail处理)的任何邮件服务器的消息由于TLS握手失败而被推迟。 这只是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 

注意:这些日志是由于我的客户不希望复制和粘贴的东西less,他们意外泄漏敏感数据。 信息在那里,我只是手工input,所以忽略错别字等。

这就是我能从日志中得到的所有东西,即使是15日志(除此之外,系统开始变成磁盘限制)。

问题:

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

然后,服务器A收到Microsoft证书链后,服务器A发送自己的客户端证书。 Outlook.com然后丢弃连接。

我们的客户证书是我们用于组织内validation的自签名证书,不应该出去outlook.com。

从我有限的知识,我最好的猜测是,outlook.com正在请求客户端证书进行validation(或至lesssendmail认为其请求证书),服务器A上的sendmail是强制性的。 然后Outlook.com将删除连接,因为证书是无效的或不是它所期望的。

两个问题:

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

  2. 有没有办法阻止sendmail向我们域外的服务器发送客户端证书,即使服务器请求它? 从我做的实验中,如果我简单地忽略证书请求并发送消息,outlook.com将接受消息。

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

欢迎来到Serverfault! 🙂

你有没有明确configurationSendMail使用TLS? 如果不是,开箱即用,SendMail仍然会尝试使用零字节的客户端证书执行机会性的TLS操作。 我认为这是你所看到的? 欲了解更多关于这个(奇怪?)的信息,请查看@ MadHatter的优秀回应: https ://serverfault.com/a/514180/21875

所以,就这样说,我会按照他们被问到的顺序回答你的问题:

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

当两个MTA尝试为STARTTLSbuild立安全隧道时,他们通常会协商安全信息并交换公共证书,这样他们就可以安全地将信息彼此encryption。 如果sendmail没有向outlook.com提供客户端证书,则outlook.com邮件服务器将无法将响应/确认encryption回sendmail。

  1. 有没有办法阻止sendmail向我们域外的服务器发送客户端证书,即使服务器请求它? 从我做的实验中,如果我简单地忽略证书请求并发送消息,outlook.com将接受消息。

你有几个select:

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

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

从技术上讲 ,你也可以破解sendmail.mc文件,以防止sendmail检查TLS能力。 我不会推荐这样做,因为它需要微妙的变化。

从问题到答案部分传输解决scheme。

对于有这个问题的人来说,我发现了根本原因和解决办法。

我无法阻止客户端证书被发送到微软,所以我唯一的select是找出微软拒绝服务器的原因。 在创build证书时,我们使用的是不同于ehlo中提供的服务器名称。 例如mx1.example.com中的helo和mx.example.com中的mx.example.com 。 这种不匹配导致微软没有任何解释地放弃连接。