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