SMTP на C: STARTTLS через OpenSSL - PullRequest
       10

SMTP на C: STARTTLS через OpenSSL

3 голосов
/ 01 апреля 2010

Я использую openssl для создания безопасных SMTP-подключений к gmail.com:25. Поэтому я могу успешно подключиться к серверу и отправить команду STARTTLS (я получаю 220 2.0.0 Ready to start TLS). Затем выполните следующий код без отключения:

SSL_METHOD* method = NULL;

SSL_library_init();
SSL_load_error_strings();

method = SSLv23_client_method();

ctx = SSL_CTX_new(method);
if (ctx == NULL)
{
    ERR_print_errors_fp(stderr);
}
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2);
ssl = SSL_new(ctx);
if (!SSL_set_fd(ssl, socket))
{
        ERR_print_errors_fp(stderr);
        return;
}
if (ssl)
{

    if (SSL_connect((SSL*)ssl) < 1)
    {
        ERR_print_errors_fp(stderr);
    }
    // then i think i need to send EHLO
}

Но после вызова SSL_connect я получаю сообщение об ошибке:

24953:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:601:

Если я использую SSLv3_client_method, я получаю сообщение об ошибке:

18143:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:284.

И если TLSv1_client_method:

21293:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:284:

Почему? Что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 08 апреля 2010

Я столкнулся с той же проблемой вчера.Вот как я это решил:- начните с создания обычного сокета TCP и подключите его к smtp.gmail.com:587- отправить команду "ehlo [127.0.0.1] \ r \ n"- получить ответы с сервера (обратите внимание: пока все ясно)- отправить команду «STARTTLS \ r \ n»- получить ответ (то есть "220 Ready for TLS")- в этот момент создайте свою оболочку ssl (method, ctx и т. д.) и используйте «SSL_set_fd» и «SSL_connect» для ее активации- отправить новую команду «ehlo [127.0.0.1] \ r \ n», но с использованием сокета SSL

С этого момента используйте «SSL_write» и «SSL_read» с сокетом SSL для отправки вашей аутентификационной информации и электронной почты.

Обратите внимание, что этот метод только шифрует ваши данные, но не аутентифицируетсебя (или сервера) с SSL-сертификатами.Но для меня это решило проблему получения «неизвестного протокола».

Надеюсь, это поможет ...Фил

0 голосов
/ 06 апреля 2010

Читаете ли вы символы \r (возврат каретки) и \n (символ новой строки), которые разделяют конец ответа сервера 220 перед запуском TLS?

0 голосов
/ 02 апреля 2010

Попробуйте использовать SSLv3_client_method или TLSv1_client_method вместо SSLv23_client_method. Я не думаю, что Gmail поддерживает SSLv23.

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