在 VB.net 中使用 MailKit 和没有证书的 TLS
Using MailKit with TLS with no certificates in VB.net
我正在尝试更改我们的代码以使用 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 发送电子邮件。有什么想法吗?
作为Jimi noted, you can set a ServerCertificateValidationCallback方法。
如果您阅读了上述文档,它可能会帮助您设计出比 return true
更好的解决方案,但在最简单的情况下,将其设置为始终 returns true 的函数就可以了满足您的需求。
根据错误消息,听起来 是 证书链,只是 SMTP 服务器 可能 使用自签名 SSL 证书 and/or 由贵公司而非官方 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 更安全 ;-)
我正在尝试更改我们的代码以使用 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 发送电子邮件。有什么想法吗?
作为Jimi noted, you can set a ServerCertificateValidationCallback方法。
如果您阅读了上述文档,它可能会帮助您设计出比 return true
更好的解决方案,但在最简单的情况下,将其设置为始终 returns true 的函数就可以了满足您的需求。
根据错误消息,听起来 是 证书链,只是 SMTP 服务器 可能 使用自签名 SSL 证书 and/or 由贵公司而非官方 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 更安全 ;-)