c# - 使用 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?
解决方案
MailKit 有 2 种不同的 SSL/TLS 方式:
- 连接到远程服务器后立即使用 SSL/TLS
- 连接并读取问候语后使用 STARTTLS 命令切换到 SSL/TLS 模式以检查服务器是否支持它
您正在尝试使用第二种模式,但您正在连接到需要第一种模式的端口 (993)。
哪个版本的 SSL 与 TLS 与这两种模式中的任何一种一起使用完全取决于服务器支持什么(实际上,从技术上讲,MailKit 默认不支持任何版本的 SSL,它只支持 TLSv1.0、TLSv1.1 和TLSv1.2 - 几年前我默认删除了 SSLv3)。
您可以通过设置client.SslProtocols
属性来更改您希望将 MailKit 限制为支持的 SSL 和/或 TLS 版本的方式。
推荐阅读
- visual-studio-2017 - 有谁知道您是否可以在本地调试 Service Fabric 群集?
- r - 时间序列的数据转换
- html - WCAG 2.0 验证错误:在此上下文中,元素 span= 不允许作为元素 a 的子级。(抑制来自该子树的更多错误。)
- bash - 将 BASH 变量中的数据插入到 sql 查询中
- javascript - How to change the class of one object inside a Vue container?
- sql - PL/SQL:在 for 循环中加入语句
- r - 我如何编写自己的函数来自动计算 R 中的临床特征和基因
- python - Django ORM:如果表B中具有相同的id(FK),则从表A中选择行,如果满足条件,则选择A中的行:
- audio - 如何从音频文件中删除静音,同时保留一些原本被删除的部分?
- python - NameError 在理解中引用类变量