Получение "Удаленный сертификат недействителен в соответствии с процедурой проверки", когда SMTP-сервер имеет действительный сертификат
Это кажется распространенной ошибкой, но пока я нашел обход (см. ниже), я не могу определить причину, по которой я получаю ее в первую очередь.
Я пишу SMTP-функции в наше приложение, и я пытаюсь добавить функциональность SSL к рабочему SMTP, который у нас уже есть.
Я тестирую сервер нашей компании MS Exchange и, в частности, включен параметр веб-почты. Я могу отправлять электронные письма внутри моего кода, не аутентифицируя мое соединение и отправляя анонимно, однако эти письма не будут перенаправляться на внешние адреса электронной почты из-за политики наших компаний. Кроме того, я программирую это для наших клиентов, и они не все разрешают открытые ретрансляторы и/или анонимные соединения.
Я полагаю, что сервер Exchange использует Explicit SSL/TLS. Я попробовал telnet на адрес сервера на 25-м порту и получил текстовый ответ, читаемый человеком, который, согласно некоторым из моих поисков ранее, означает, что он использует Явный SSL/TLS.
У меня есть следующий тестовый код
SmtpClient SMTPClient = new SmtpClient(webmailaddress);
SMTPClient.Port = 25;
SMTPClient.UseDefaultCredentials = true;
SMTPClient.EnableSsl = true;
System.Net.Mail.MailMessage Message = new `
System.Net.Mail.MailMessage(emailFrom,emailTo,subject,body);
SMTPClient.Send(Message);
Во время поиска решения я столкнулся с этим "Удаленный сертификат недействителен в соответствии с процедурой проверки." с использованием SMTP-сервера Gmail
Из чего я получил следующий код...
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
public static bool ValidateServerCertificate(object sender,X509Certificate certificate,X509Chain chain,SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
else
{
if (System.Windows.Forms.MessageBox.Show("The server certificate is not valid.\nAccept?", "Certificate Validation", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
return true;
else
return false;
}
}
Это работает в моем тестовом коде. ОДНАКО, что фактический процесс, который я пишу (а не мой тестовый код), будет запущен в фоновом режиме и не может спросить пользователя (вместо этого он сообщает об ошибках в журнале ошибок Windows).
Как только я начал, мой вопрос на самом деле, почему я вообще получаю эту ошибку. Если я перейду в https: webmail.ourdomain.co.uk в браузере, он покажет действительный сертификат и нет возможности установить сертификат (как я бы сделал, если бы это был самозанятый).
Однако, когда я запускаю свой код с помощью отладки отладки в методе ValidateServerCertificate, я просматриваю значения сертификата и вижу эмитента нашего локального сервера и "не использовать до" и "не использовать после" свойства Cегодня. Это не соответствует сертификату, который я получаю.
Я также проверил, какие флаги sslPolicyErrors находятся в отладке ValidateServerCertificate, и они показывают "RemoteCertificateChainErrors" и "RemoteCertificateNameMismatch".
Так что мне не хватает об этом... почему он не использует правильный сертификат? Если есть шаги, которые я должен предпринять, чтобы установить сертификат локально для его использования, тогда мне нужно знать их, чтобы я мог сказать своим клиентам, что делать, если они это получат.
Я не хочу просто обходить проверку, возвращая true из метода ValidateServerCertificate, и поскольку это фоновый процесс, я не могу спросить пользователя, поэтому мне нужно понять, как заставить мой код использовать правильный/доверенный сертификат.
Надеюсь, кто-то может посоветовать.
Ответы
Ответ 1
Наконец, я нашел ответ, что служба SMTP на сервере не использует тот же сертификат, что и https.
Диагностические шаги которые я прочитал здесь, делают предположение, что они используют один и тот же сертификат, и каждый раз, когда я пробовал это в прошлом, они сделали и шаги диагностики как раз то, что я сделал для решения проблемы несколько раз.
В этом случае эти шаги не сработали, потому что используемые сертификаты были разными, и возможность этого - это то, что я никогда не встречал.
Решение заключается в том, чтобы экспортировать фактический сертификат с сервера, а затем установить его как доверенный сертификат на моем компьютере или получить другой действующий/доверенный сертификат для службы SMTP на сервере. Это в настоящее время с нашим ИТ-отделом, который управляет серверами, чтобы решить, что они хотят делать.
Ответ 2
Старый пост, но, как вы сказали, "почему он не использует правильный сертификат", я хотел бы предложить способ узнать, какой SSL-сертификат используется для SMTP (см. здесь), для которого требуется openssl:
openssl s_client -connect exchange01.int.contoso.com:25 -starttls smtp
Здесь будет описан использованный SSL-сертификат для службы SMTP. Исходя из того, что вы видите здесь, вы можете заменить неправильный сертификат (например, вы уже сделали) с правильным (или доверять сертификату вручную).
Ответ 3
Старый пост, но я думал, что поделюсь своим решением, потому что для этой проблемы не так много решений.
Если вы используете старую машину Windows Server 2003, вам, скорее всего, потребуется установить исправление (KB938397).
Эта проблема возникает из-за того, что Cryptography API 2 (CAPI2) в Windows Сервер 2003 не поддерживает семейство алгоритмов хэширования SHA2. CAPI2 является частью API криптографии, который обрабатывает сертификаты.
https://support.microsoft.com/en-us/kb/938397
По какой-то причине Microsoft хочет отправить вам это исправление по электронной почте, а не разрешить вам загружать напрямую. Здесь прямая ссылка на исправление из письма:
http://hotfixv4.microsoft.com/Windows Server 2003/sp3/Fix200653/3790/бесплатно/315159_ENU_x64_zip.exe