修复 starttls verify=fail, verifymsg=unable to get local issuer certificate

soo*_*oot 7 smtp sendmail smarthost

使用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
Run Code Online (Sandbox Code Playgroud)

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

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

Received: from unknown (HELO example.com) (info@example.com@12.34.56.78)
  by 0 with ESMTPA; 15 Aug 2016 07:10:15 -0000
Run Code Online (Sandbox Code Playgroud)

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

如何获得有关证书问题的更多详细信息,以及如何避免验证失败?我的猜测是 的多个子域mail.example.com.netsolmail.net与证书上的名称不够匹配。但是我如何验证这一点,以及如何避免投诉 - 或者更确切地说,我如何才能获得Received标头以确认与ESMTPSA.

编辑:我编辑sendmail.mc添加

define(`confLOG_LEVEL', `15')dnl
Run Code Online (Sandbox Code Playgroud)

现在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
Run Code Online (Sandbox Code Playgroud)

我认为这意味着验证失败的至少一个原因是 sendmail 找不到运行它的本地计算机的证书?由于我只是将外发邮件中继到 netsol 服务器,从不接受来自 Internet 的传入邮件,因此我认为我不需要为此服务器提供证书。如果我需要一个,我在哪里/如何安装它?它可以是我用于网络服务器的相同证书,还是我需要不同的证书?使用自签名证书是否足以让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
Run Code Online (Sandbox Code Playgroud)

在其中,并且我已验证该文件存在。我没有注意到dnl那些行开头的偷偷摸摸的小东西!我知道这意味着什么,但是因为我很少看 m4 源代码,而且它dnl紧跟在其他一些被标记为注释的行之后#,我的大脑将它们记录为没有被注释掉!

我实际上经历了一系列从 Firefox 下载证书并将 sendmail 指向我用于我们网站的 Digicert 证书的循环,但由于该主机只发送电子邮件,从不接收电子邮件,因此不需要其他任何东西。我放回dnl的定义confSERVER_CERTconfSERVER_KEY,和一切都很好,与maillog显示verify=OKverifymsg=ok在适当的STARTTLS=client线路。

但是即使没有关于 TLS 的诊断,Received连接到 netsol的标头仍然显示with ESMTPA而不是with ESMTPSA. 哦,好吧,@MadHatter 对那个也有兴奋剂。对不起,这太长了,有点像大白鹅。但是我学到了很多,并且确实改进了我的配置(以非重要的方式)。我希望有人绝望地涉水通过这可能会学到一些东西,也是。

Mad*_*ter 6

这在很大程度上是一个问题,我会这样理解。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
Run Code Online (Sandbox Code Playgroud)

我希望能看到 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 <me@example.net>; Sat, 16 Jul 2016 03:05:24 +0100
Run Code Online (Sandbox Code Playgroud)

要了解接收器的 MTA 是什么意思ESMTPA,您必须找出该 MTA 是什么,并阅读文档。除非你这样做了,否则我认为你无法读懂这组信件。

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

我不认为你可以。SSL 背后的基本思想是(a)您连接到的主机名(b)提供由可信第三方(c)在 CN 或 SAN 字段中使用该主机名签名的证书。如果不满足这些属性中的任何一个,则 SSL 指出它无法验证对等方的身份是正确的。

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