Exchange 2016 服务器拒绝证书已过期

Exchange 2016 服务器拒绝证书已过期

我们使用 TLS 从 DMZ 中的 Windows 2012R2(未加入域)Web 服务器向我们的内部 Exchange 2016 服务器(也在 Windows 2012R2 上运行)发送电子邮件。这一直运行良好,直到大约一个月前,它们停止发送(我们现在才注意到这一点,因为电子邮件发送频率非常低)。我强制发送了一封测试邮件,当我查看传输角色协议日志时,我看到以下内容:

2020-06-24 11:02:33.524,
  MAILSERVER\Client Frontend MAILSERVER,
  0102030405060708,
  6,
  192.168.1.44:587,
  192.168.2.3:64961,
  *,
  " CN=*.example.com CN=Sectigo RSA Domain Validation Secure Server CA, O=Sectigo Limited, L=Salford, S=Greater Manchester, C=GB     
    0102030405060708090A0B0C0D0E0F10
    0102030405060708090A0B0C0D0E0F1011121314
    2020-03-17T19:00:00.000Z 
    2021-03-18T18:59:59.000Z 
    *.example.com;example.com",
  Sending certificate Subject Issuer name Serial number Thumbprint Not before Not after Subject alternate names

2020-06-24 11:02:33.540,
  MAILSERVER\Client Frontend MAILSERVER,
  0102030405060708,
  7,
  192.168.1.44:587,
  192.168.2.3:64961,
  *,
  ,
  TLS negotiation failed with error CertExpired

您可以看到该证书的有效期为2020年3月17日至2021年3月18日。

客户端显示错误日志如下:

SERVER -> CLIENT: 220 mailserver.example.com Microsoft ESMTP MAIL Service ready at Wed, 24 Jun 2020 11:02:32 -0500
CLIENT -> SERVER: EHLO www.example.com
250-SIZE 36700160
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-AUTH GSSAPI NTLM
250-8BITMIME
250-BINARYMIME
250 CHUNKING
CLIENT -> SERVER: STARTTLS
SERVER -> CLIENT: 220 2.0.0 SMTP server ready
Connection failed. Error #2: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed [E:\...\class-smtp.php line 374]SMTP Error: Could not connect to SMTP host.
CLIENT -> SERVER: QUIT
SERVER -> CLIENT: SMTP ERROR: QUIT command failed: Connection: closedSMTP Error: Could not connect to SMTP host.

邮件服务器上的事件日志显示以下事件:

A fatal alert was received from the remote endpoint. The TLS protocol defined fatal alert code is 45.
- System 
 - Provider 
     [ Name]  Schannel 
     [ Guid]  {1F678132-5938-4686-9FDC-C8FF68F15C85} 
   EventID 36887 
   Version 0 
   Level 2 
   Task 0 
   Opcode 0 
   Keywords 0x8000000000000000 
 - TimeCreated 
     [ SystemTime]  2020-06-24 11:02:33.540386500
   EventRecordID 417754 
   Correlation 
 - Execution 
     [ ProcessID]  484 
     [ ThreadID]  1552 
   Channel System 
   Computer mailserver.example.com 
 - Security 
     [ UserID]  S-1-5-18 
- EventData 
    AlertDesc 45 

但是,再次强调,此事件仅表明证书已过期。

您对 Exchange 认为证书已过期的原因有何看法?我已检查两台机器上的日期/时间,精确到秒。谢谢!

答案1

您的信息未显示所使用的链证书 - 请尝试openssl s_client -connect $host:$port -servername $host -showcerts通过 运行每个生成的 PEM 块openssl x509 -text,或者如果您愿意,可以将它们放在(单独的)文件中并双击。(如果是 OpenSSL 1.1.1,则不再需要-servername $host。)

许多 Comodo^WSectigo CA 使用 USERTrust-to-AddTrust 桥接,该桥接已于 5 月 30 日到期; 看https://security.stackexchange.com/questions/232978/how-to-fully-view-cross-signed-certificate-signatureshttps://stackoverflow.com/questions/62107431/curl-error-60-ssl-certificate-problem-certificate-has-expired并且与上述两者相关https://support.sectigo.com/articles/Knowledge/Sectigo-AddTrust-External-CA-Root-Expiring-May-30-2020。特别是 Sectigo RSA DV 服务器的唯一透明记录证书是https://crt.sh/?id=924467861USERTrust RSA 拥有四个已知证书,列于https://crt.sh/?caid=1167因此,如果您使用的是 AddTrust #4860286,您会看到它的 notAfter 是 2020-05-30——大约一个月前。

答案2

这正是 joeqwerty 上面所说的,您是否检查过分配给证书或绑定到连接器的 SMTP 服务?

您可以运行以下命令来检查:

Get-ReceiveConnector | FL Identity,RemoteIPRanges,PermissionGroups,Auth*,TlsCertificateName

更多详细信息:为 Exchange Server 接收连接器配置 TLS 证书名称

答案3

因此@dave_thompson_085 的想法是正确的,问题在于位于我的证书链根目录的 AddTrust 证书已过期。在修复 Exchange 服务器上的问题后(​​通过重新创建没有 AddTrust 根目录的 PFX 证书文件并重新导入它),我仍然收到相同的错误。我设置了第二个客户端并尝试发送电子邮件,发现它正常工作,所以我知道问题一定出在客户端机器上。使用 Exchange 服务器上的 WireShark,我观察了两台机器之间的 TLS 流量,可以看到 Exchange 服务器将发送证书及其直接父证书(Sectigo CA 证书),然后客户端会拒绝它,因为它已过期(即使两个证书都有效)。我假设客户端必须验证收到的证书,并以某种方式发现它们链接到过期的 AddTrust 根目录。电子邮件是由 PHPMailer 发送的,所以我查看了 PHP 设置,发现它有一个它使用的 CA 包(因为 PHP 显然无法使用 Windows 证书存储)。查看该 CA 包,我发现并删除了 AddTrust 证书,从而解决了该问题。

相关内容