使用TLS时,Microsoft拒绝了Sendmail邮件

我将在序言中作为一个声明说我不是sendmail的专家.我很少使用它,但在这种情况下,我必须为我的客户.

背景:

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

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

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

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

这就是我从日志中获得的全部内容,即使是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地址列表,这是一个麻烦.

最佳答案
欢迎来到Serverfault! 🙂

您是否已明确配置SendMail以使用TLS?如果没有,开箱即用,SendMail仍将尝试使用零字节客户端证书执行机会性TLS操作.我认为这就是你所看到的?有关这方面的更多信息(古怪?),请查看@MadHatter的优秀回复:https://serverfault.com/a/514180/21875

那么,话虽如此,我会按照他们被问到的顺序回答你的问题:

  1. Why is sendmail sending the client certificate to outlook.com as part of STARTTLS?

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

  1. Is there a way that I can prevent sendmail from sending client certificates to servers outside our domain, even if the server requests it? From the experiments I’ve done, outlook.com will accept the message if I simply ignore the certificate request and send the message.

你有几个选择:

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

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

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

转载注明原文:使用TLS时,Microsoft拒绝了Sendmail邮件 - 代码日志