【问题标题】:SslHandshakeException: An error occurred while attempting to establish an SSL or TLS connectionSslHandshakeException:尝试建立 SSL 或 TLS 连接时发生错误
【发布时间】:2020-03-20 10:02:23
【问题描述】:

我正在尝试使用 imap 访问 gmail 电子邮件,但代码在 ssl 握手时失败,但没有显示任何错误。如果有人能帮忙解决这个问题,我真的很感激。我使用 xunit、.NET Core 2.1 构建了它。我正在使用 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);

          }

【问题讨论】:

  • 这能回答你的问题吗? Access emails using imap
  • Yohan:请选择@jstedfast的答案,这个答案真的很全面,可以帮助人们更快地找到所有案例的正确答案。

标签: c# ssl imap xunit mailkit


【解决方案1】:

禁用 Avast 杀食软件。 这对我有用

【讨论】:

    【解决方案2】:

    await client.ConnectAsync(_emailConfig.SmtpServer, _emailConfig.Port, false);

    只需在客户端配置中将“useSsl”选项设置为 false

    【讨论】:

      【解决方案3】:

      这是来自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 命令(又名STLS 用于 POP3)可选 服务器支持。

      下面是 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 证书。

      邮件服务器通常会使用自签名证书,而不是使用 已由受信任的证书颁发机构签名。另一个潜在的陷阱是在本地 安装的防病毒软件会替换证书以扫描网络流量以查找病毒。

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

      您可以通过提供自定义 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 全天候运行,但偶尔 由于您和服务器之间的其他网络问题,它们确实出现故障或无法访问。当这件事发生时, 无法检查链中一个或多个证书的吊销状态。

      要忽略吊销检查,您可以设置 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);
      
          // ...
      }
      

      【讨论】:

      • client.CheckCertificateRevocation = false; 为我工作
      • 非常全面的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      相关资源
      最近更新 更多