【问题标题】:Using MailKit with TLS with no certificates in VB.net在 VB.net 中使用带有 TLS 且没有证书的 MailKit
【发布时间】:2020-05-12 11:53:33
【问题描述】:

我正在尝试更改我们的代码以使用 MailKit 发送电子邮件,因为旧的 SMTPClient 已过时。

我们连接到我们自己的服务器,不需要进行身份验证。代码如下:

Using client = New SmtpClient()
    Dim values = SQL.EMAIL_SQL.GetSMTPInfo("MailHostOutsideNetwork")
    client.Connect(values.Item1, values.Item2, Security.SecureSocketOptions.None)
    client.Send(Message)
    client.Disconnect(True)
End Using

只要我不使用 TLS 或 SSL,它就可以正常工作并发送电子邮件。当我尝试使用它们中的任何一个时,都会出现异常:

尝试建立 SSL 或 TLS 连接时出错。 无法验证服务器的 SSL 证书,原因如下: - 服务器证书有以下错误: - 已处理的证书链,但以不受信任提供者信任的根证书终止。

所以,我的第一个想法是联系我们的 IT 部门并询问证书。他们告诉我我们从来没有任何证书,而且很可能永远不会(一些许可废话)。 问题是他们仍然希望我们在发送电子邮件时使用 TLS,而我的老板说必须有办法做到这一点(我基本上回答了......好吧,如果我们的系统和证书井井有条。她不是很高兴哈哈)。

所以,现在我在这里问你是否有任何方法可以做到这一点。使用没有证书的 TLS 发送电子邮件。有什么想法吗?

【问题讨论】:

  • ServicePointManager.ServerCertificateValidationCallback = Function(s, c, ca, pe) Return True End Function(在 3 行中,在创建连接之前)
  • 正如@jstedfast 所指出的,ServerCertificateValidationCallback 的使用必须限于众所周知的、可靠的来源,出于可以理解的原因,由于证书验证失败而产生异常。您可以构建一个验证回调,如here 所示(参见TlsValidationCallback 代码),修改它(使用此处答案中的示例作为蓝图)以仅处理已知的颁发者。之后,您可以将ServerCertificateValidationCallback 设置为Nothing(这样其他代码就不会误调用它)。

标签: vb.net mailkit


【解决方案1】:

正如Jimi 所说,您可以设置ServerCertificateValidationCallback 方法。

如果您阅读了上述文档,它可能会帮助您设计出比 return true 更好的解决方案,但在最简单的情况下,将其设置为始终返回 true 的函数将满足您的需求。

根据错误消息,听起来有 证书链,只是 SMTP 服务器可能使用自签名 SSL 证书和/或由您的公司而非官方 SSL 证书颁发机构生成的根证书,因此发送电子邮件的系统不信任您的 SMTP 服务器使用的根证书。

您还可以在此处查看 MailKit 的默认行为:https://github.com/jstedfast/MailKit/blob/master/MailKit/MailService.cs#L356

基本上,如果问题只是一个不受信任的根(听起来像是您的问题),那么它会退回到它检查的受信任邮件服务器证书详细信息的硬编码列表:

var cn = certificate.GetNameInfo (X509NameType.SimpleName, false);
var fingerprint = certificate.Thumbprint;
var serial = certificate.SerialNumber;
var issuer = certificate.Issuer;

显然你不会知道这些字符串,但是如果你编写一个自定义函数来打印这些信息,那么你可以将这些值硬编码到验证回调函数的未来版本中并感觉比只返回 true 安全一点;-)

【讨论】:

  • 非常感谢您的回答。我会看一下该信息,并肯定在回调函数中使用它。我真的不喜欢它只是返回 true
猜你喜欢
  • 1970-01-01
  • 2014-05-05
  • 2021-09-20
  • 2014-02-20
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 2015-02-09
  • 2018-12-23
相关资源
最近更新 更多