让SmtpClient使用自签名SSL证书

时间:2010-01-28 10:32:41

标签: c# ssl smtpclient self-signed

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

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

3 个答案:

答案 0 :(得分:10)

您可以查看ServerCertificateValidationCallback属性:

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

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

答案 1 :(得分:3)

我的问题最终是.Net SmtpClient类显然不支持使用端口465进行SMTP SSL连接。使用带有自签名SSL证书的端口25可以正常工作。

MSDN System.Net论坛问题Can SmtpClient be configured to work with a self signed certificate?

答案 2 :(得分:0)

如果您想更加安全,则可以考虑执行以下操作:

theClient.EnableSsl = true;

ServicePointManager.ServerCertificateValidationCallback =
    (sender, certificate, chain, sslPolicyErrors) => {
        if (sender == theClient) {
            return true;
        } else {
            // you should apply the code from this SO answer
            // https://stackoverflow.com/a/25895486/795690
            // if you find that anything in your app uses this path
            throw new ApplicationException("Certificate validation is currently disabled, extra code neeeded here!");
        }
    };

在此代码中,我们仅针对特定的SMTP客户端自动批准证书;我们有一个存根代码路径,如果您发现应用程序中的任何其他内容都在使用它,则应升级到explicitly reinstate default certificate validation

另一种有用的仅在this SO answer中批准证书的有用方法。