Mailkit IMapClient 未命中 ServerCertificateValidationCallback & SslHandshakeException



我正试图在Windows server 2019计算机上使用以下代码连接到IMAP服务器:

using (var client = new ImapClient(new ProtocolLogger("protocol.log")))
{
var address = EnvReader.GetStringValue("EMAIL_ADDRESS");
var password = EnvReader.GetStringValue("EMAIL_PASSWORD");
var creds = new NetworkCredential(address, password);
client.CheckCertificateRevocation = false;
client.ServerCertificateValidationCallback = (s, c, h, e) =>
{
Console.WriteLine("ALL UP IN THIS CALLBACK" + e.ToString());
return true;
};
client.Connect("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect);
client.Authenticate(address, password);
}

在我的Mac上,这段代码运行得很好,我可以连接并随后进行身份验证。

在Windows机器上,我收到以下异常:

MailKit.Security.SslHandshakeException: An error occurred while attempting to establish an SSL or TLS connection.
This usually means that the SSL certificate presented by the server is not trusted by the system for one or more of
the following reasons:
1. The server is using a self-signed certificate which cannot be verified.
2. The local system is missing a Root or Intermediate certificate needed to verify the server's certificate.
3. A Certificate Authority CRL server for one or more of the certificates in the chain is temporarily unavailable.
4. The certificate presented by the server is expired or invalid.
5. The set of SSL/TLS protocols supported by the client and server do not match.
6. You are trying to connect to a port which does not support SSL/TLS.
See https://github.com/jstedfast/MailKit/blob/master/FAQ.md#SslHandshakeException for possible solutions

根据链接的FAQ中的信息,我添加了ServerCertificateValidationCallback,但回调从未命中(前面提到的异常仍然被抛出,相关的控制台日志记录从未发生,调试时回调中的断点也从未命中(。

根据我的阅读,ServerCertificateValidationCallback应该处理异常消息提到的案例#1-4。事实上,我可以在Mac上的指定端口上连接,这似乎排除了第6种情况(我还尝试了端口143+SecureSocketOptions.StartTls(。这就剩下第5种情况了,然而,我找不到任何信息表明Windows Server 2019无法处理SSL/TSL协议。

对于a(处理此异常和/或b(弄清楚ServerCertificateValidationCallback没有启动的原因的任何想法,我们都将不胜感激。

编辑:我的项目引用了.NET 5.0

让我们了解每种可能性:

  1. 服务器正在使用无法验证的自签名证书

outlook.office365.com将不会使用自签名证书,因此在这种情况下不会出现问题。

  1. 本地系统缺少验证服务器证书所需的根证书或中间证书

这是非常可能的,但ServerCertificateValidationCallback覆盖应该覆盖此故障。然而,它并没有被击中。。。所以它实际上并没有绕过这个潜在的错误。

  1. 链中一个或多个证书的证书颁发机构CRL服务器暂时不可用

这将被client.CheckCertificateRevocation = false;否定

  1. 服务器提供的证书已过期或无效

情况并非如此,因为证书要到2022年1月21日才会过期。

  1. 客户端和服务器支持的SSL/TLS协议集不匹配

服务器至少支持TLSv1.2,这是MailKit在所有目标框架版本(.NET 4.5->5.0+netstandard2.x(中支持的默认TLS协议版本。

  1. 您正试图连接到不支持SSL/TLS的端口

端口993是正确的端口,SslOnConnect是正确的选项,所以这不是问题所在。

假设MailKit的SslStream.AuthenticateAsClientSync((调用中没有通过验证回调方法的错误(.NET 5.0与其他版本不同(,那么InnerException是什么?也许这将提供一些见解。

相关内容

  • 没有找到相关文章

最新更新