Это кажется распространенной ошибкой, но пока я нашел обход (см. ниже), я не могу определить причину, по которой я получаю ее в первую очередь.
Я пишу 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, и поскольку это фоновый процесс, я не могу спросить пользователя, поэтому мне нужно понять, как заставить мой код использовать правильный/доверенный сертификат.
Надеюсь, кто-то может посоветовать.