在VB.net中使用不带证书的TLS的MailKit

在VB.net中使用不带证书的TLS的MailKit,vb.net,mailkit,Vb.net,Mailkit,由于旧的SMTPClient已经过时,我正在尝试更改我们的代码以使用MailKit发送电子邮件 我们连接到自己的服务器,不需要验证。代码如下: Using client = New SmtpClient() Dim values = SQL.EMAIL_SQL.GetSMTPInfo("MailHostOutsideNetwork") client.Connect(values.Item1, values.Item2, Security.SecureSocketOptions.N

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

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

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,而我的老板说一定有办法做到这一点(我基本上是这样回答的……嗯,是的,如果我们的系统和证书井然有序的话。她很不高兴lol)

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

如前所述,您可以设置一个方法

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

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

您还可以在此处查看MailKit的默认行为:

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

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

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

ServicePointManager.ServerCertificateValidationCallback=函数(s、c、ca、pe)返回真正的结束函数
(在创建连接之前,在3行中),正如@jstedfast所指出的那样,
ServerCertificateValidationCallback
的使用必须限于已知的,可靠的源,出于可以理解的原因,由于证书验证失败而生成异常。您可以构建一个验证回调,如图所示(请参见
TlsValidationCallback
code),修改它(将此处答案中的示例用作蓝图),以仅处理已知的颁发者。之后,您可以将
服务器CertificateValidationCallback
设置为
Nothing
(这样其他代码就不会错误地调用它)。非常感谢您的回答。我将查看一下这个信息,并在回调函数中使用它。我真的不喜欢它只是返回真实