这是来自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.None,
SecureSocketOptions.StartTls 或 SecureSocketOptions.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);
// ...
}