Заставляем SmtpClient работать с самоподписанным SSL-сертификатом

Я пытаюсь использовать класс System.Net.Mail.SmtpClient для ретрансляции электронной почты через почтовый сервер моей компании. Все SMTP-подключения к почтовому серверу должны быть SSL и использовать самозаверяющий сертификат. Это нормально для Outlook, где вы можете просто щелкнуть ОК в диалоговом окне с предупреждением, но знает ли кто-нибудь способ заставить SmtpClient принять самоподписанный сертификат?

Я планирую использовать это приложение на платформе Windows Azure, поэтому я не смогу установить самозаверяющий сертификат в качестве доверенного корня.


person sipsorcery    schedule 28.01.2010    source источник


Ответы (3)


Вы можете взглянуть на свойство ServerCertificateValidationCallback :

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

Он представляет собой обратный вызов, который вызывается средой выполнения, когда она пытается проверить сертификат SSL. Возвращая true, вы в основном говорите, что вам все равно, действителен сертификат или нет -> вы всегда его принимаете. Конечно, наличие самоподписанных сертификатов в производственной среде - не лучшая идея.

person Darin Dimitrov    schedule 28.01.2010
comment
Я немного заглянул в угол ServicePoint, но я увидел этот комментарий на странице документации ServicePoint / Members. Обеспечивает управление соединениями для HTTP-соединений, поэтому у меня сложилось впечатление, что он не будет использоваться для SMTP. Кроме того, когда я пробую это и помещаю сообщение журнала в обратный вызов, он никогда не вызывается. - person sipsorcery; 28.01.2010
comment
Вы должны поместить это до любых попыток создания экземпляра класса SmtpClient, в идеале в некотором разделе глобальной инициализации вашего приложения. - person Darin Dimitrov; 28.01.2010

Моя проблема в том, что класс .Net SmtpClient, по-видимому, не поддерживает использование порта 465 для SMTP SSL-соединений. Использование порта 25 с самоподписанным сертификатом SSL работало правильно.

Вопрос на форуме MSDN System.Net Можно Настроить SmtpClient для работы с самоподписанным сертификатом?.

person sipsorcery    schedule 06.02.2010

Если вы хотите быть в большей безопасности, вы можете сделать следующее:

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-клиента; у нас есть путь к заглушке, который вам следует обновить до явного восстановления проверки сертификата по умолчанию, если вы обнаружите, что что-то еще в вашем приложении используй это.

Другой полезный подход к утверждению сертификатов только в тех контекстах, где вы действительно хотите, содержится в этом ответе SO.

person MikeBeaton    schedule 20.11.2020