在VB.net中使用不带证书的TLS的MailKit
由于旧的SMTPClient已经过时,我正在尝试更改我们的代码以使用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
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
(这样其他代码就不会错误地调用它)。非常感谢您的回答。我将查看一下这个信息,并在回调函数中使用它。我真的不喜欢它只是返回真实