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 и т. Д., И можете сосредоточиться на основной функции вашей программы.

Другие вопросы по тегам