Отправка электронной почты из приложения .net через почтовый сервер с самозаверяющим сертификатом SSL - PullRequest
4 голосов
/ 22 июня 2010

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

Затем мы создали самозаверяющий сертификат, чтобы проверить, можно ли отправить сообщение через безопасныйchannel.I создал сертификат с 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 считало его доверенным?Я имею в виду, я уже установил его как Trusted Root Certification Authority и мог проверить, запустив mmc, поэтому я не знаю, куда идти ...

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

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

РЕДАКТИРОВАТЬ: Пример кода:

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

SmtpClient mailClient = new SmtpClient("smtp.domain.com");
mailClient.Credentials = new NetworkCredential("username@domain.com", "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"

Ответы [ 5 ]

1 голос
/ 08 октября 2014

Как сказал gerryLowry:

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

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

1 голос
/ 05 декабря 2011

в настоящее время вы можете , а не отправлять почту с помощью 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

0 голосов
/ 27 февраля 2014

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

        MailMessage message = new MailMessage();
        message.From = new MailAddress("me@myself.home", "Me");
        message.Body = "hello, World!";
        message.To.Add(new MailAddress("you@myself.home", "You"));

        SmtpClient client = new SmtpClient("secure.myself.home", 25);
        client.EnableSsl = false;
        client.UseDefaultCredentials = false;
        client.Credentials = new NetworkCredential("me@myself.home", "pwd");

        client.Send(message);
0 голосов
/ 23 июня 2010

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

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

"Серьезность: 2 (высокая), код: HM5113, Источник: TCPServer :: Run (), Описание: Не удалось загрузить файл сертификата. Дорожка: <...> test.cer, Адрес: 0.0.0.0, порт: 25, ошибка: An указан неверный аргумент "

Может быть, это касается и вашего hMailServer?

0 голосов
/ 22 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...