我们使用 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 认为证书已过期的任何想法?我已经检查了两台机器上的日期/时间,它们对第二台机器都是正确的。谢谢!
您的信息未显示使用的链证书 - 尝试
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 服务器的唯一透明记录证书是 USERTrust RSA下的https://crt.sh/?id=924467861 ,它在https://crt.sh/?caid=1167列出了四个已知证书因此,如果您使用的是 AddTrust #4860286,您可以看到它的 notAfter 是 2020-05-30——大约一个月前。
这正是 joeqwerty 上面所说的,您是否检查了分配给证书或绑定到连接器的 SMTP 服务?
您可以运行以下命令进行检查:
有关更多详细信息:为 Exchange Server 接收连接器配置 TLS 证书名称
所以@dave_thompson_085 的想法是正确的,因为问题是位于我的证书链根的 AddTrust 证书已过期。在 Exchange 服务器上解决问题后(通过重新创建没有 AddTrust 根的 PFX 证书文件并重新导入它)我仍然遇到同样的错误。我设置了第二个客户端并尝试发送电子邮件,发现它工作正常,所以我知道问题必须出在客户端机器上。在 Exchange 服务器上使用 WireShark,我观察了两台机器之间的 TLS 流量,并且可以看到 Exchange 服务器会发送证书及其直接父证书(Sectigo CA 证书),然后客户端会因为过期而拒绝它(即使两者证书有效)。我假设客户端必须验证收到的证书并以某种方式发现它们链接到过期的 AddTrust 根。电子邮件是由 PHPMailer 发送的,所以我查看了 PHP 设置,发现它有一个它使用的 CA 包(因为 PHP 显然不能使用 Windows 证书存储)。查看那个 CA 捆绑包,我发现并删除了 AddTrust 证书并纠正了问题。