修复 starttls verify=fail、verifymsg=无法获取本地颁发者证书

修复 starttls verify=fail、verifymsg=无法获取本地颁发者证书

使用 在 EC2 实例上运行 Amazon Linux sendmail。我有一个 Network Solutions 电子邮件帐户,并SMART_HOST在我的sendmail配置中使用该帐户作为中继。除了一个小细节外,它运行良好。

在我的maillog文件中我看到如下条目:

sendmail[28450]: STARTTLS=client, relay=mail.example.com.netsolmail.net., version=TLSv1/SSLv3, verify=FAIL, cipher=DHE-RSA-AES256-SHA, bits=256/256

经过一番研究,我得出的结论是,这verify=FAIL本质上是无害的:连接实际上是加密的,只是无法验证主机的证书。

因为除了我之外没有人会阅读日志文件,所以我不会在意。但是当消息到达时,标题Received显示

Received: from unknown (HELO example.com) ([email protected]@12.34.56.78)
  by 0 with ESMTPA; 15 Aug 2016 07:10:15 -0000

我希望看到,with ESMPTSA但我猜测证书验证失败导致“S”被抑制。

我如何才能更详细地了解证书出了什么问题,以及如何避免验证失败?我猜想的多个子域mail.example.com.netsolmail.net与证书上的名称不够匹配。但我如何验证这一点,如何避免投诉 - 或者更确切地说,我如何让标Received头确认与的安全连接ESMTPSA

编辑:我编辑sendmail.mc添加

define(`confLOG_LEVEL', `15')dnl

现在 maillog 提供了更多详细信息。紧接着这一verify=FAIL行,我现在看到:

sendmail[30706]: STARTTLS=client, cert-subject=/OU=GT39680792/OU=See+20www.rapidssl.com/resources/cps+20+28c+2915/OU=Domain+20Control+20Validated+20-+20RapidSSL+28R+29/CN=*.hostingplatform.com, cert-issuer=/C=US/O=GeoTrust+20Inc./CN=RapidSSL+20SHA256+20CA+20-+20G3, verifymsg=unable to get local issuer certificate

我认为这意味着验证失败的至少一个原因是 sendmail 找不到它所运行的本地机器的证书?由于我只将外发邮件中继到 netsol 服务器,从不接受来自互联网的传入邮件,所以我认为我不需要该服务器的证书。如果我需要证书,我在哪里/如何安装它?它可以是我用于我的网络服务器的相同证书吗,还是我需要不同的证书?使用自签名证书是否足以让标题Received显示with ESMTPSA,还是需要来自 CA 的商业证书?

编辑#2:

我接受 @MadHatter 的回答。关键是要confCACERT定义。我很尴尬,我唯一的借口是老脑袋不理解 m4 源。Amazon Linux 上的默认 sendmail.mc 文件已经有了

define(`confCACERT_PATH', `/etc/pki/tls/certs')dnl
define(`confCACERT', `/etc/pki/tls/certs/ca-bundle.crt')dnl

在其中,并且我已经验证该文件确实存在。我没有注意到dnl这些行开头的那个小秘密!我知道它的意思,但由于我很少看 m4 源代码,而且它就在其他一些dnl被标记为注释的 -ed 行之后#,我的大脑将它们识别为不是被注释掉了!

实际上,我经历了一系列从 Firefox 下载证书并将 sendmail 指向我用于我们网站的 Digicert 证书的麻烦,但由于此主机只发送电子邮件,从不接收电子邮件,因此无需进行其他操作。我将 放回 和 的定义dnl中,一切正常,并在相应的行上显示和。confSERVER_CERTconfSERVER_KEYmaillogverify=OKverifymsg=okSTARTTLS=client

但即使没有关于 TLS 的诊断,Received与 netsol 的连接标头仍然显示with ESMTPA而不是with ESMTPSA。哦,好吧,@MadHatter 也知道这一点。抱歉,这篇文章太长了,有点徒劳无功。但我学到了很多东西,我确实改进了我的配置(以一种非关键的方式)。我希望那些迫切想要读完这篇文章的人也能学到一些东西。

答案1

这在很大程度上是一个部分问题,我会这样看待它。sendmail几十年来,我一直将其作为我的首选 MTA,但我不能声称自己是这方面的专家(即,我不是 Eric Allman)。

verifymsg=unable to get local issuer certificate

我认为这意味着验证失败的至少一个原因是 sendmail 找不到其正在运行的本地机器的证书?

这似乎是OpenSSL 消息,而不是 MTA 消息,据我所知,这意味着验证应用程序无法获取颁发者证书的本地副本。换句话说,sendmail 无法访问包含颁发远程服务器证书的任何人根证书的证书包。请记住,Linux 不提供集中式证书管理服务,因此每个应用程序都必须推出自己的包。就我而言,我使用以下 m4 代码授予 sendmail 访问证书包的权限:

define(`confCACERT', `/etc/pki/tls/certs/ca-bundle.with.intermediate.crt')dnl

我希望看到 ESMPTSA,但我猜测证书验证失败导致“S”被抑制。

我认为这个猜测是错误的。RFC2821 和 2822 对 Received: 标头的格式非常灵活,我在其中找不到任何区分ESMTPAESMPTSA(原文如此)的东西。我的标头都显示如下行:

Received: from example.com (example.com [80.70.90.61])
    by lory.teaparty.net (8.14.4/8.14.4) with ESMTP id u6G25OXi006577
    (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL)
    for <[email protected]>; Sat, 16 Jul 2016 03:05:24 +0100

要了解接收方的 MTA 的含义ESMTPA,您必须找出该 MTA 是什么,并阅读文档。除非您这样做,否则我认为您无法从这些字母集合中读出太多信息。

verify=fail当服务器主机名与证书不匹配时,我可以避免 starttls

我认为你不能。SSL 背后的基本思想是(A)您连接的主机名(二)提供由受信任的第三方签名的证书(C)将该主机名添加到 CN 或 SAN 字段中。如果任何这些属性不满足,SSL 就会指出它无法验证对等方的身份。

您不应该对此进行过多的解读;自签名证书在电子邮件处理中仍然非常常见。在我最近发送/接收的 1919 封 TLS 安全电子邮件中,有 1764 封涉及由于某种原因无法验证身份的对等方,而只有 155 封可以验证身份。您自己正在使用自签名证书;因此您应该感到高兴,大多数人并不真正关心 SMTP TLS 对等方上的信任链!

相关内容