2010-04-01 9 views
3

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

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: 

Почему? Что я делаю неправильно?

ответ

1

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

+0

Если я использую SSLv3_client_method я получаю сообщение об ошибке: 18143: ошибка: 1408F10B: SSL процедура: SSL3_GET_RECORD: неправильный номер версии: s3_pkt.c: 284. И если TLSv1_client_method: 21293: ошибка: 1408F10B: SSL процедуры: SSL3_GET_RECORD: неправильный номер версии: s3_pkt.c: 284: Смешной :) – Jackell

0

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

2

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

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

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

Надеется, что это помогает ...
Phil

+0

да, спасибо! – Jackell

+2

На самом деле нет необходимости использовать порт 587 - smtp.gmail.com принять STARTTLS на 25 просто отлично, как вы можете видеть, запустив 'openssl s_client -connect smtp.gmail.com:25 -starttls smtp'. –

+0

Добавьте -crlf в конец, если вы не получили ответа после этой команды. – n0rm1e