使用TLS而非SSL使用Mailkit ImapClient连接到gmail

时间:2018-10-04 08:46:10

标签: c# gmail mailkit

我正在尝试使用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?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

可以通过设置client.SslProtocols属性来更改想要限制MailKit的受支持SSL和/或TLS版本的方式。