【问题标题】:Sending email from a .net application via a mail server with a self-signed SSL certificate通过带有自签名 SSL 证书的邮件服务器从 .net 应用程序发送电子邮件
【发布时间】:2010-06-22 18:37:25
【问题描述】:

我安装了 hmailserver 5.3.2 并进行了配置。它接收和发送 电子邮件正常,但我想用它从 .net/C# 发送电子邮件 应用程序位于另一台服务器上,为此我想使用 SSL 通信。之前,应用程序被配置为发送 通过 gmail 发送电子邮件,在端口 587 上运行正常,但现在我们想使用 我们自己的邮件服务器。我们首先将应用程序配置为连接 smtp.domain.com 在端口 25 上运行,它会发送电子邮件。

那我们 创建了一个自签名证书来测试我们是否可以发送 通过安全通道发送消息。我创建了证书 openSSL 设置通用名称为:mail.domain.com, smtp.domain.com, *.domain.com、domain.com。我在防火墙上打开了 587 端口,然后 将 hmailserver 配置为使用证书进行入站连接 那个港口。 我创建的证书都不起作用(我尝试了一个,然后 创建了另一个,依此类推),在 应用:

System.Exception: _COMPlusExceptionCode = -532459699

当然我也尝试过通过 telnet 连接:telnet smtp.domain.com 587,我只是得到一个空白屏幕。这不是防火墙问题,因为 当我禁用端口 587 上的 ssl 时,我可以正常连接。 查看日志甚至没有显示使用时尝试连接 587 与 SSL。

我已经检查了这些问题:Getting SmtpClient to work with a self signed SSL certificateUsing a self-signed certificate with .NET’s HttpWebRequest/Response,但它并没有解决我的问题。 ServerCertificateValidationCallback 的方法没有任何影响。

我尝试使用端口 25(这也在上述问题之一中提出)、465、587,并且所有 3 个端口都发生了相同的情况:初始握手 (SYN / SYN-ACK / ACK) 和大约 80 秒后连接已关闭(FIN),中间没有任何内容。

我是否必须在某处安装该证书以便 .net 应用程序将其视为受信任?我的意思是,我已经将它安装为受信任的根证书颁发机构,并且可以通过运行 mmc 进行检查,所以我现在不知道该去哪里...

感谢您的帮助!

PS:不确定这是否属于 ServerFault,因为它涉及 C# 应用程序,但也涉及邮件服务器...

编辑:代码示例:

ServicePointManager.ServerCertificateValidationCallback = 
(sender, certificate, chain, sslPolicyErrors) => true;

SmtpClient mailClient = new SmtpClient("smtp.domain.com");
mailClient.Credentials = new NetworkCredential("username@domain.com", "pwd");
mailClient.Port = 587;
mailClient.EnableSsl = true;
MailMessage mailMessage = new MailMessage("mailAddressFrom", "mailAddressTo", "subject", "body");
mailMessage.IsBodyHtml = true;
mailClient.Send(mailMessage);

编辑 2:日志(基于 Ramunas 的建议):

"TCPIP" 3588    "2010-06-23 10:02:49.685"   "TCPConnection - Posting AcceptEx on 0.0.0.0:465"
"DEBUG" 3588    "2010-06-23 10:02:49.809"   "Creating session 24039"
"TCPIP" 772 "2010-06-23 10:04:29.639"   "TCPConnection - SSL handshake with client failed. Error code: 2, Message: End of file, Remote IP: X"
"DEBUG" 772 "2010-06-23 10:04:29.639"   "Ending session 24039"

【问题讨论】:

  • 您可以尝试提供您正在尝试做的事情的代码示例。本来打算发个答案的,不过和上面的signed link上面的一些回复是一样的。

标签: c# .net ssl smtp self-signed


【解决方案1】:

目前,无论 hMailServer 使用的证书是购买的还是自签名的,您都可以使用 c# 4/.NET 4 向 hMailServer 发送邮件。

问题是两部分 AFAIK ... c# 4/.NET 4 将仅使用 TLS 和端口 587 发送; hMailServer 目前不支持 STARTTLS。 c# 4/.NET 4 不支持 465/SSL 的替代方案。

在 hMailServer 的论坛上查看此主题 "configuring SSL confusion ..."

"SmtpClient.EnableSsl Property ":
“另一种连接方法是在发送任何协议命令之前预先建立 SSL 会话。这种连接方法有时称为 SMTP/SSL、SMTP over SSL 或 SMTPS,默认情况下使用端口 465。这种使用 SSL 的备用连接方法目前不支持。” -- MSDN

【讨论】:

    【解决方案2】:

    正如格里洛瑞所说:

    c# 4/.NET 4 将仅使用 TLS 和端口 587 发送;
    hMailServer 目前不支持 STARTTLS

    您可以将您的 hMailServer 更新到 hMailServer 5.5.1 (BETA) here
    它现在支持 STARTTLS 并且端口 587 一切正常。

    【讨论】:

      【解决方案3】:

      这是一种复杂的机制,但简而言之,客户端(您从中建立连接的计算机)应该知道 WHO 是证书颁发者(在您的情况下,您的服务器是证书颁发者)。如果它在受信任的根证书颁发机构列表中找不到它,则认为此连接不安全。 (我敢打赌,您已经看到浏览器警告您对某些 https://.... 站点的不安全请求)。

      在客户端计算机上的 Microsoft 管理控制台中打开证书管理单元,并尝试将相同的自签名证书添加到受信任的根证书颁发机构列表中。

      【讨论】:

      • 不幸的是,我已经尝试过这种方法,正如您在“谢谢”上方的段落中看到的那样......
      【解决方案4】:

      我安装了 hMailServer,创建了自签名证书,将其添加到 hMailServer,但也无法通过它发送邮件。虽然我在发送没有证书的电子邮件时成功了。

      我启用了 hMailServer 上的登录(对于所有内容)并再次尝试但没有成功。但我在日志文件中看到一个错误,说明

      “严重性:2(高),代码:HM5113, 来源:TCPServer::Run(),描述: 无法加载证书文件。小路: <...>test.cer, 地址:0.0.0.0,端口:25,错误:An 提供了无效的参数”

      也许这也是您的 hMailServer 上的一个案例?

      【讨论】:

      • 是的,我应该已经为所有内容启用了日志记录。感谢您的推动!我会给+1,但我的声誉仍然不足......无论如何,我用日志显示的内容更新了问题,这是一个不同的错误。
      【解决方案5】:

      我在我的 hMailServer 上打开了端口 25 作为普通 SMTP,并在 SSL 上打开了端口 465,所以我不得不更改我的代码以指向普通的 SMTP 配置。它应该在那之后工作。至于 SSL,对不起,它在 hMailServer 上不起作用……

              MailMessage message = new MailMessage();
              message.From = new MailAddress("me@myself.home", "Me");
              message.Body = "hello, World!";
              message.To.Add(new MailAddress("you@myself.home", "You"));
      
              SmtpClient client = new SmtpClient("secure.myself.home", 25);
              client.EnableSsl = false;
              client.UseDefaultCredentials = false;
              client.Credentials = new NetworkCredential("me@myself.home", "pwd");
      
              client.Send(message);
      

      【讨论】:

        猜你喜欢
        • 2013-12-18
        • 2017-06-08
        • 1970-01-01
        • 2018-04-15
        • 2019-04-06
        • 2015-05-31
        • 2018-10-17
        • 2015-03-21
        • 2013-10-24
        相关资源
        最近更新 更多