SMTPS: OpenSSL - подпрограммы SSL:SSL23_GET_SERVER_HELLO: неизвестный протокол s23_clnt.c:787:
Я использую OpenSSL для того, чтобы зашифровать некоторые электронные письма, которые отправляет аппаратная часть. Но всякий раз, когда я пытаюсь вызвать SSL_connect(), я получаю: SSL-подпрограммы:SSL23_GET_SERVER_HELLO: неизвестный протокол
После отправки "EHLO" и "STARTTLS" я вызываю следующую функцию:
SSL_CTX *ctx = NULL;
SSL *ssl = NULL;
void CreateTLSSession(int sockfd)
{
printf("///////////////creating TLS Session/////////////////////\n");
SSL_library_init();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
ctx = SSL_CTX_new(SSLv23_client_method());
if (ctx == NULL)
{
printf("failed to initialize context\n");
return;
}
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2);
ssl = SSL_new(ctx);
if (!SSL_set_fd(ssl, sockfd))
{
printf("failed to bind to socket fd\n");
return;
}
if (SSL_connect(ssl) < 1)
{
ERR_print_errors_fp(stdout);
fflush(stdout);
printf("SSL_connect failed\n");
return;
}
}
Я пытался подключиться к:
- smtp.live.com: 587 -> Подпрограммы SSL:SSL23_GET_SERVER_HELLO: неизвестный протокол s23_clnt.c:787:
- smtp.live.com: 25 -> Подпрограммы SSL:SSL23_GET_SERVER_HELLO: неизвестный протокол s23_clnt.c:787:
- smtp.gmail.com: 587 -> Подпрограммы SSL:SSL23_GET_SERVER_HELLO: неизвестный протокол s23_clnt.c:787:
- smtp.gmail.com: 465 -> нет ответа от сервера вообще!
- smtp.gmail.com: 25 -> подпрограммы SSL:SSL23_GET_SERVER_HELLO: неизвестно
протокол s23_clnt.c:787:
Я пробовал разные порты, так как некоторые похожие вопросы в этой SO предполагали, что такая ошибка обычно связана с использованием неправильного порта для SSL.
Я что-то здесь упускаю?
ОБНОВИТЬ:
Все другие методы (например, TLSv1_1_method(), SSLv3_method() ...) приводят к SSL3_GET_RECORD: неправильный номер версии
ОБНОВИТЬ:
Я был в состоянии наблюдать следующее на wireshark:
"EHLO"
"к вашим услугам"
"STARTTLS"
"Готов к старту"
-> Теперь я вызываю вышеуказанную функцию
нечитаемый запрос (зашифрованный)
нечитаемый ответ (зашифрованный)
-> ОШИБКА
3 ответа
Основной носок был неблокирующим. Проблема была решена с помощью select
и ожидание, пока рукопожатие TLS завершится.
SMTP-серверы на портах 587 и 25 обычно имеют обычный текст и переключаются на TLS только после начального диалога SMTP и команды STARTTLS от клиента. И попытка SSL_connect на сокете простого текста потерпит неудачу.
Другим способом решения этой проблемы может быть запуск вашей программы на С под управлением Скотта Гиффорда. sslclient
(см. http://www.superscript.com/ucspi-ssl/sslclient.html). sslclient создаст вашу программу и откроет tcp-соединение с сервером, направит стандартный вывод вашей программы на сервер и направит вывод с сервера на стандартный вывод вашей программы. У него есть исправленная версия для TLS, которая запускает соединение в виде обычного текста, а затем, как только обе стороны договорились о STARTTLS, ваша программа может сообщить sslive о включении шифрования SSL для соединения, записав команду для файлового дескриптора для этого. цель. Хорошая вещь в этом заключается в том, что вы можете позволить sslclient выполнять все тяжелые работы, вплоть до настройки сокетов, ssl и т. Д., И можете сосредоточиться на основной функции вашей программы.