C# 让SmtpClient使用自签名SSL证书

C# 让SmtpClient使用自签名SSL证书,c#,ssl,smtpclient,self-signed,C#,Ssl,Smtpclient,Self Signed,我正在尝试使用System.Net.Mail.SmtpClient类通过公司的电子邮件服务器转发电子邮件。到邮件服务器的所有SMTP连接都必须是SSL,并且它使用自签名证书。这对于Outlook来说很好,您可以在警告对话框中单击ok,但是有人知道让SmtpClient接受自签名证书的方法吗 我计划在Windows Azure平台上使用此应用程序,因此无法将自签名证书作为受信任的根安装。您可以查看属性: ServicePointManager.ServerCertificateValidation

我正在尝试使用System.Net.Mail.SmtpClient类通过公司的电子邮件服务器转发电子邮件。到邮件服务器的所有SMTP连接都必须是SSL,并且它使用自签名证书。这对于Outlook来说很好,您可以在警告对话框中单击ok,但是有人知道让SmtpClient接受自签名证书的方法吗


我计划在Windows Azure平台上使用此应用程序,因此无法将自签名证书作为受信任的根安装。

您可以查看属性:

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

它表示运行时在尝试验证SSL证书时调用的回调。返回
true
基本上就是说你不在乎证书是否有效->你总是接受它。当然,在生产环境中使用自签名证书不是一个好主意。

我的问题是.Net SmtpClient类显然不支持将端口465用于SMTP SSL连接。将端口25与自签名SSL证书一起使用可以正常工作


MSDN System.Net论坛问题。

如果您想更安全,您可能需要考虑执行以下操作:

theClient.EnableSsl=true;
ServicePointManager.ServerCertificateValidationCallback=
(发件人、证书、链、sslPolicyErrors)=>{
如果(发送方==客户){
返回true;
}否则{
//您应该应用此答案中的代码
// https://stackoverflow.com/a/25895486/795690
//如果您发现应用程序中的任何内容都使用此路径
抛出新的ApplicationException(“当前已禁用证书验证,此处需要额外代码!”);
}
};
在此代码中,我们仅自动批准特定SMTP客户端的证书;我们有一个存根代码路径,如果您发现应用程序中的其他任何东西正在使用它,您应该升级到该路径


另一种不同的、有用的方法是仅在您真正想要的上下文中批准证书。

我确实从ServicePoint的角度看了一点,但我在ServicePoint/Members文档页面上看到了这条评论“为HTTP连接提供连接管理”,因此我觉得它不会用于SMTP。另外,当我尝试它并在回调中放入日志消息时,它从未被调用。在尝试实例化
SmtpClient
类之前,您需要先放入日志消息,最好是在应用程序的某个全局初始化部分。