Отправка электронной почты из приложения .net через почтовый сервер с самоподписанным SSL-сертификатом

Я установил hmailserver 5.3.2 и настроил его. Он обычно принимает и отправляет электронные письма, но я хотел использовать его для отправки электронных писем из приложения .net / C #, расположенного на другом сервере, и для этого я хотел использовать связь SSL. Раньше приложение было настроено на отправку писем через Gmail через порт 587, и оно работало нормально, но теперь мы хотим использовать наш собственный почтовый сервер. Сначала мы настроили приложение для подключения к smtp.domain.com через порт 25, и оно работает, оно отправляет электронное письмо.

Затем мы создали самоподписанный сертификат, чтобы проверить, можем ли мы отправить сообщение через безопасный канал. Я создал сертификат с установкой общего имени openSSL как: mail.domain.com, smtp.domain.com, * .domain.com, domain.com. Я открыл порт 587 на брандмауэре и настроил hmailserver для использования сертификата для входящих подключений на этом порту. Ни один из созданных мной сертификатов не сработал (я попробовал один, а затем создал другой и т. Д.), Что привело к возникновению следующего (общего) исключения в приложении:

System.Exception: _COMPlusExceptionCode = -532459699

Конечно, я также пытался подключиться через telnet: telnet smtp.domain.com 587, и у меня просто был пустой экран. Это не проблема брандмауэра, поскольку, когда я отключаю ssl на порту 587, я могу нормально подключаться. Просмотр журнала даже не показывает попытки подключения при использовании 587 с SSL.

Я уже проверял эти вопросы: Как заставить SmtpClient работать с самоподписанный сертификат SSL и Использование самозаверяющего сертификат с .NET HttpWebRequest / Response, но это не решило мою проблему. Подход с ServerCertificateValidationCallback не имел любое влияние.

Я пробовал с портами 25 (что также предлагается в одном из вопросов выше), 465, 587, и со всеми 3 происходит то же самое: начальное рукопожатие (SYN / SYN-ACK / ACK) и примерно через 80 с соединение закрыто (FIN), ничего промежуточного.

Нужно ли мне устанавливать этот сертификат где-нибудь, чтобы приложение .net считало его доверенным? Я имею в виду, что я уже установил его как доверенный корневой центр сертификации и мог проверить, запустив mmc, поэтому я понятия не имею, куда мне теперь идти ...

Спасибо за помощь!

PS: Не уверен, принадлежит ли это ServerFault, поскольку это касается приложения C #, но также почтового сервера ...

РЕДАКТИРОВАТЬ: образец кода:

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

SmtpClient mailClient = new SmtpClient("smtp.domain.com");
mailClient.Credentials = new NetworkCredential("[email protected]", "pwd");
mailClient.Port = 587;
mailClient.EnableSsl = true;
MailMessage mailMessage = new MailMessage("mailAddressFrom", "mailAddressTo", "subject", "body");
mailMessage.IsBodyHtml = true;
mailClient.Send(mailMessage);

РЕДАКТИРОВАТЬ 2: Журнал (на основе предложения Рамунаса):

"TCPIP" 3588    "2010-06-23 10:02:49.685"   "TCPConnection - Posting AcceptEx on 0.0.0.0:465"
"DEBUG" 3588    "2010-06-23 10:02:49.809"   "Creating session 24039"
"TCPIP" 772 "2010-06-23 10:04:29.639"   "TCPConnection - SSL handshake with client failed. Error code: 2, Message: End of file, Remote IP: X"
"DEBUG" 772 "2010-06-23 10:04:29.639"   "Ending session 24039"

person Richard    schedule 22.06.2010    source источник
comment
Вы можете попробовать предоставить образец кода того, что вы пытаетесь сделать. Я собирался опубликовать ответ, но он такой же, как и ответ на себя signed link выше.   -  person Matthew Whited    schedule 23.06.2010


Ответы (5)


в настоящее время вы не можете отправлять почту с помощью c # 4 / .NET 4 на hMailServer независимо от того, куплен ли сертификат, используемый hMailServer, или самозаверяющий.

проблема состоит в двух частях AFAIK ... c # 4 / .NET 4 будет отправлять только с использованием TLS и порта 587; hMailServer в настоящее время не поддерживает STARTTLS. c # 4 / .NET 4 не поддерживает альтернативу 465 / SSL.

см. эту ветку «настройка путаницы с SSL ...» на сайте hMailServer Форум.

«Свойство SmtpClient.EnableSsl»:
«Альтернативный метод подключения - это когда сеанс SSL устанавливается заранее до отправки каких-либо протокольных команд. Этот метод подключения иногда называется SMTP / SSL, SMTP через SSL или SMTPS и по умолчанию использует порт 465. Это альтернативное подключение метод с использованием SSL в настоящее время не поддерживается. " - MSDN

person gerryLowry    schedule 04.12.2011

Как сказал Джерри Лоури:

c # 4 / .NET 4 будет отправлять только с использованием TLS и порта 587;
hMailServer в настоящее время не поддерживает STARTTLS

Вы можете обновить свой hMailServer до hMailServer 5.5.1 (BETA) здесь
Теперь он поддерживает STARTTLS и порт 587 все работает правильно.

person Seven    schedule 08.10.2014

Это сложный механизм, но простыми словами, клиент (компьютер, с которого вы подключаетесь) должен знать, кто является эмитентом сертификата (в вашем случае ваш сервер является эмитентом сертификата). Если он не находит его в списке доверенных корневых центров сертификации, он считает это соединение небезопасным. (Готов поспорить, вы видели, как браузер предупреждал вас о небезопасном запросе на какой-то сайт https: // ....).

Откройте оснастку «Сертификаты» в консоли управления Microsoft на клиентском компьютере и попробуйте добавить тот же самозаверяющий сертификат в список доверенных корневых центров сертификации.

person Ramunas    schedule 22.06.2010
comment
К сожалению, я уже пробовал этот подход, как вы можете видеть в абзаце над надписью «спасибо» .... - person Richard; 22.06.2010

Я установил hMailServer, создал самоподписанный сертификат, добавил его в hMailServer и тоже не смог отправлять почту через него. Хотя я успешно отправлял электронные письма без сертификата.

Я включил вход на hMailServer (для всего) и попытался снова, но безуспешно. Но я увидел ошибку в файле журнала, в которой говорилось

«Уровень серьезности: 2 (высокий), код: HM5113, источник: TCPServer :: Run (), описание: не удалось загрузить файл сертификата. Путь:‹ ...> test.cer, адрес: 0.0.0.0, порт: 25, Ошибка: был предоставлен недопустимый аргумент "

Может быть, это тоже случай с вашим hMailServer?

person Ramunas    schedule 22.06.2010
comment
Да, я должен был уже включить ведение журнала для всего. Спасибо за толчок! Я бы поставил +1, но репутации все еще не хватает ... В любом случае я обновил вопрос, указав, что показывает журнал, и это уже другая ошибка. - person Richard; 23.06.2010

У меня на hMailServer открыт порт 25 как обычный SMTP, а также порт 465 для SSL, поэтому мне пришлось изменить свой код, чтобы он указывал на обычную конфигурацию SMTP. После этого он должен работать. Что касается SSL, извините, на hMailServer он работать не будет ...

        MailMessage message = new MailMessage();
        message.From = new MailAddress("[email protected]", "Me");
        message.Body = "hello, World!";
        message.To.Add(new MailAddress("[email protected]", "You"));

        SmtpClient client = new SmtpClient("secure.myself.home", 25);
        client.EnableSsl = false;
        client.UseDefaultCredentials = false;
        client.Credentials = new NetworkCredential("[email protected]", "pwd");

        client.Send(message);
person Riaan de Lange    schedule 27.02.2014