SslHandshakeException:尝试建立SSL或TLS连接时发生错误

问题描述 投票:0回答:1

我正在尝试使用imap访问gmail电子邮件,并且代码在ssl握手时失败,但没有显示任何错误。非常感谢任何人可以帮助您。我已经使用.NET Core 2.1 xunit构建了它。我正在使用MailKit Nuget

   public GMailHandler(string mailServer, int port, bool ssl, string login, string password)

          //mailServer = imap.gmail.com
          //port = 993
          //ssl = true

          {

                  if (ssl)

                         Client.Connect(mailServer, port);

                  else

                         Client.Connect(mailServer, port);

                  Client.Authenticate(login, password);

                  Client.Inbox.Open(FolderAccess.ReadOnly);

          }
c# ssl imap xunit mailkit
1个回答
0
投票

这里是MailKit FAQ的副本和粘贴:

问:为什么我尝试连接时会得到"MailKit.Security.SslHandshakeException: An error occurred while attempting to establish an SSL or TLS connection."

[当您收到该错误消息的异常时,通常意味着您正在遇到以下情况之一:

1。邮件服务器在指定的端口上不支持SSL。

有两种不同的方式对邮件服务器使用SSL / TLS加密。

第一种方法是在连接到服务器后立即启用SSL / TLS加密SMTP,POP3或IMAP服务器。此方法需要一个“ SSL端口”,因为标准为协议定义的端口用于纯文本通信。

第二种方法是通过[[可选的STARTTLS命令(对于POP3为aka STLS)服务器支持。

下面是MailKit支持的协议和标准纯文本端口的表(要么完全不支持任何SSL / TLS加密,要么仅通过STARTTLS命令扩展名)和需要SSL / TLS加密的SSL端口成功连接到远程主机。

|Protocol|Standard Port|SSL Port| |:------:|:-----------:|:------:| | SMTP | 25 or 587 | 465 | | POP3 | 110 | 995 | | IMAP | 143 | 993 |

对于要连接的端口,请使用正确的SecureSocketOptions

如果连接到上述标准端口之一,则需要使用SecureSocketOptions.NoneSecureSocketOptions.StartTlsSecureSocketOptions.StartTlsWhenAvailable

如果连接到SSL端口之一,则需要使用SecureSocketOptions.SslOnConnect

您也可以尝试通过选择适当的选项来使用SecureSocketOptions.Auto通过将指定端口与上表中的端口进行比较。

2。您要连接的邮件服务器正在使用过期的(或其他不受信任的)SSL证书。

[通常,邮件服务器将使用自签名证书,而不是使用已由受信任的证书颁发机构签名。另一个潜在的陷阱是当本地已安装的防病毒软件将替换证书,以便扫描Web通信中是否存在病毒。

当您的系统由于未签名而无法验证邮件服务器的证书时由已知和受信任的证书颁发机构,将发生上述错误。

您可以通过提供自定义RemoteCertificateValidationCallback来解决此问题并将其设置在客户的ServerCertificateValidationCallback上财产。

在最简单的示例中,您可以执行以下操作(尽管我强烈建议在生产用途):

using (var client = new SmtpClient ()) { client.ServerCertificateValidationCallback = (s,c,h,e) => true; client.Connect (hostName, port, SecureSocketOptions.Auto); // ... }

[最有可能您要比较证书的Thumbprint属性设置为您先前验证过的已知值。

您还可以使用此回调来提示用户(就像您可能已经看到过网络浏览器一样)关于证书是否值得信任。

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

大多数证书颁发机构可能非常擅长将其CRL和/或OCSP服务器保持24/7全天候运行,但偶尔它们

do

掉线或由于您和服务器之间的其他网络问题而无法访问。当这个情况发生时,无法检查链中一个或多个证书的吊销状态。要忽略吊销检查,您可以设置CheckCertificateRevocation连接之前,将IMAP,POP3或SMTP客户端的false属性设置为:

using (var client = new SmtpClient ()) { client.CheckCertificateRevocation = false; client.Connect (hostName, port, SecureSocketOptions.Auto); // ... }

4。服务器不支持客户端配置为使用的同一组SSL / TLS协议。

MailKit试图跟上最新的安全建议,因此会不断删除旧的SSL和TLS从默认配置中不再被认为是安全的协议。这通常意味着MailKit的SMTP,POP3和IMAP客户端将无法连接到仍在使用旧版SSL和TLS协议的服务器。目前,默认情况下不支持的SSL和TLS协议是:SSL v2.0,SSL v3.0和TLS v1.0。

您可以覆盖MailKit的默认支持SSL and TLS protocols通过设置SslProtocols的值SMTP,POP3或IMAP客户端上的媒体资源。

例如:

using (var client = new SmtpClient ()) { // Allow SSLv3.0 and all versions of TLS client.SslProtocols = SslProtocols.Ssl3 | SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13; client.Connect ("smtp.gmail.com", 465, true); // ... }

© www.soinside.com 2019 - 2024. All rights reserved.