通过C#Mailkit / Mimekit发送电子邮件,但服务器证书错误来自

时间:2017-09-26 08:23:13

标签: c# ssl ssl-certificate mailkit mimekit

Visual Studio 2015中的代码

1我正在使用Mailkit最新版本(1.18.1.1)从我自己的电子邮件服务器发送电子邮件。

2电子邮件服务器具有自签名证书,该证书不受信任。

3我在代码中添加了以下两行,以忽略SERVER CERTIFICATE错误:

client.ServerCertificateValidationCallback = (mysender, certificate, chain, sslPolicyErrors) => { return true; };
client.CheckCertificateRevocation = false;

4但我的程序仍然崩溃。

5在电子邮件服务器日志中,它显示错误:

  

未知[xxx.xxx.xxx.xxx]的SSL_accept错误:连接重置   对等

我猜是因为服务器证书问题而来。因为在Wireshark捕获中,只要我获得SERVER证书,连接就会终止。

6我还在我的系统中安装了UNTRUSTED电子邮件服务器证书,但问题仍然存在。

7以下是错误的详细截图 enter image description here

8完整代码:

使用(var client = new SmtpClient(new ProtocolLogger(" logging.log")))

                    {

                        // For demo-purposes, accept all SSL certificates (in case the server supports STARTTLS)
                        client.ServerCertificateValidationCallback = (mysender, certificate, chain, sslPolicyErrors) => { return true; };
                        client.CheckCertificateRevocation = false;



                        client.Connect("xxx.com", 465, true);
                        // Note: since we don't have an OAuth2 token, disable
                        // the XOAUTH2 authentication mechanism.
                        client.AuthenticationMechanisms.Remove("XOAUTH2");

                        // Note: only needed if the SMTP server requires authentication
                        client.Authenticate("xxx@xxx.com","123456");

                        client.Send(message);
                        client.Disconnect(true);
}

2 个答案:

答案 0 :(得分:1)

如果你控制连接的两端,你可能想先检查没有TLS的发送,以确保只在使用TLS时才会出现问题。

还尝试在没有wireshark,fiddler或其他中间嗅探器/代理的情况下运行,以确保以安全的方式到达服务器时没有问题。检查您的防病毒或Internet安全系统是否因为不受信任的证书而关闭了您的连接。

您可能希望确保的另一件事是您的客户端和服务器共享相同的协议:我知道旧的TLS和SSL协议已被弃用,因此客户端和服务器之间可能没有通用协议

您还可以尝试启用system.net跟踪(从.NET 2.0开始提供),看看是否从您获得的(非常详细的)日志中获得了更具体的信息: https://blogs.msdn.microsoft.com/dgorti/2005/09/18/using-system-net-tracing/

System.Net跟踪是 1)每个过程 2)显示线程 3)适用于SSL 4)用于环回。 5)您不需要重新编译代码

[编辑]

我的问题似乎有点过于宽泛,无法猜测问题,请尝试缩小问题范围。例如:

  • 尝试在没有TLS的情况下连接;
  • 尝试连接到其他SMTP服务器(使用您知道标准邮件客户端可以连接的服务器);
  • 尝试使用其他客户端连接到您的服务器(例如使用thunderbird)。
  • 尝试在同一台计算机上运行客户端和服务器;
  • 在干净的虚拟机上尝试相同的操作

顺便说一句,SSPI似乎与受信任的安全问题有关,因此请仔细检查您是否未将服务器配置为仅接受受信任的用户..

[/编辑]

如果这还不够,我会尝试更新我的答案=)

HTH

答案 1 :(得分:0)

我的问题已经解决了。在CONNECT命令和APP(c#)开始工作之前,我在代码中添加了以下代码!

client.SslProtocols = System.Security.Authentication.SslProtocols.Tls11;