首页 > 解决方案 > 使用 TLS 而不是 SSL 使用 Mailkit ImapClient 连接到 gmail

问题描述

我正在尝试在 C# 代码中轮询一个 gmail 帐户。我正在使用 Mailkit 库(https://github.com/jstedfast/MailKit)。当我告诉客户端使用 SSL 时,我可以成功连接:

using (var client = new ImapClient ()) 
{
    client.Connect ("imap.friends.com", 993, true);
    client.Authenticate ("joey", "password");
    client.Disconnect (true);
}

但我的理解(可能是错误的)SSL 是不安全的,我们不应该使用它。所以我试图强制建立一个 TLS 连接:

using (var client = new ImapClient ()) 
{
    client.Connect ("imap.friends.com", 993, SecureSocketOptions.StartTls);
    client.Authenticate ("joey", "password");
    client.Disconnect (true);
}

但是这个错误就client.connect行了:

Message: The IMAP Server has unexpectedly disconnected
Stack Trace: 
   at MailKit.Net.Imap.ImapStream.<ReadAheadAsync>d__54.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at MailKit.Net.Imap.ImapStream.<ReadTokenAsync>d__69.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at MailKit.Net.Imap.ImapEngine.<ConnectAsync>d__140.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at MailKit.Net.Imap.ImapClient.<ConnectAsync>d__81.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at MailKit.Net.Imap.ImapClient.Connect(String host, Int32 port, SecureSocketOptions options, CancellationToken cancellationToken)

我正在使用协议记录器运行,但这并没有告诉我太多,它只包含 1 行:

Connected to imap://imap.gmail.com:993/?starttls=always

所以我想我的问题是:

1) 我应该担心使用不安全的 SSL 3.0 访问 gmail 吗?我很难相信他们强迫我使用已弃用的安全协议。

2) 如果是这样,我该如何强制建立 TLS 连接,以便我可以为我的应用程序服务器上的客户端关闭 SSL3.0?

标签: c#gmailmailkit

解决方案


MailKit 有 2 种不同的 SSL/TLS 方式:

  1. 连接到远程服务器后立即使用 SSL/TLS
  2. 连接并读取问候语后使用 STARTTLS 命令切换到 SSL/TLS 模式以检查服务器是否支持它

您正在尝试使用第二种模式,但您正在连接到需要第一种模式的端口 (993)。

哪个版本的 SSL 与 TLS 与这两种模式中的任何一种一起使用完全取决于服务器支持什么(实际上,从技术上讲,MailKit 默认不支持任何版本的 SSL,它只支持 TLSv1.0、TLSv1.1 和TLSv1.2 - 几年前我默认删除了 SSLv3)。

您可以通过设置client.SslProtocols属性来更改您希望将 MailKit 限制为支持的 SSL 和/或 TLS 版本的方式。


推荐阅读