繁体   English   中英

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

[英]Sending email via C# Mailkit / Mimekit but server certificate error comes in

0 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 以下是错误的详细截图在此处输入图片说明

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);
}

如果您控制连接的两端,您可能需要先检查不使用 TLS 的发送,以确保问题仅在使用 TLS 时发生。

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

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

您还可以尝试启用 system.net 跟踪(自 .NET 2.0 起可用),看看是否从您获得的(非常详细的)日志中获得了一些更具体的见解: https : //blogs.msdn.microsoft.com/dgorti/2005 /09/18/使用系统网络跟踪/

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

[编辑]

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

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

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

[/编辑]

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

HTH

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM